JAVA中是否有更有效的方法来反转不规则的二维数组的行?

问题描述 投票:0回答:1

我编写了一个方法来翻转不规则的 java 数组的行,但这涉及 4 个不同的 for 循环,其中两个是嵌套循环。有没有更好、更有效的方法来解决这个问题?

我尝试通过循环并初始化存储翻转行大小的数组来查找翻转数组的行大小。 然后我用这些新的行大小初始化了一个 newData 数组。 接下来,我以相反的行顺序加载了 newData 数组,其中包含原始数据数组中的值。 然后我重新初始化了数据数组,以便我可以将 newData 数组复制回原始数据数组中。

public static void flipMatRows(int[][] data) {
    int[] rowSizes = new int[data.length];
    // find row sizes of newData array
    int[][] newData = new int[rowSizes.length][];
    int i = 0;
    for (int row = data.length - 1; row >= 0; row--) {
        rowSizes[i] = data[row].length;
        i++;
    }
    // initialize empty ragged array based off row sizes
    for (int row = 0; row < data.length; row++) {
        newData[row] = new int[rowSizes[row]];
    }
    // load newData with values
    int reverseRow = data.length - 1;
    for (int row = 0; row < newData.length; row++) {
        for (int col = 0; col < newData[row].length; col++) {
            newData[row][col] = data[reverseRow][col];
        }
        reverseRow--;
    }
    // re-initialize data array based off flipped row sizes
    for (int row = 0; row < data.length; row++) {
        data[row] = new int[rowSizes[row]];
    }
    // load newData back into original data array
    for (int row = 0; row < data.length; row++) {
        for (int col = 0; col < data[row].length; col++) {
            data[row][col] = newData[row][col];
        }
    }
    printMat(data);
}
java arrays sorting
1个回答
0
投票

这个怎么样?

public static void flipRows (int [][] arr) {
    int [] temp;
    for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
       temp = arr [i];
       arr[i] = arr [j];
       arr[j] = temp;
    }
}

在 Java 中,数组是 reference,即

Object
。而且,Java 没有真正的二维数组:它只有一维数组。但是,数组可以是引用数组。因此,诸如此类的声明
int [][] matrix;
指定
matrix
是一个引用数组,并且每个引用都是
int
的数组。结果之一是允许“参差不齐的二维”数组。另一个结果是交换 2D 数组的行就像交换
Object
的 1D 数组一样简单。

测试驱动程序并打印:

public static void printMat (int [][] arr) {
    for (int [] row : arr) {
        System.out.println (Arrays.toString(row));
    }
}
    
public static void testRowFlip () {
    int  [][] testArr = {{0,1,2,3},{4},{-4},{5,6,7,8,9,10},{},{11,12}};
    flipRows (testArr);
    printMat (testArr);
    System.out.println ("end of flip rows");
}

输出示例:

[11, 12]
[]
[5, 6, 7, 8, 9, 10]
[-4]
[4]
[0, 1, 2, 3]
end of flip row
© www.soinside.com 2019 - 2024. All rights reserved.