列主要订单

时间:2016-03-14 16:32:11

标签: java arrays

如果我有二维数组并且不知道大小。如何在列主要顺序中处理它而不抛出异常?由于索引超出范围,我的printColRow函数失败。

private void printRowCol(int[][] a) {
    for(int i = 0; i < a.length; i++) {
        double sum = 0.0;
        for(int j = 0; j < a[i].length; j++)  
                sum += a[i][j];
        System.out.println(sum + " ");
        }
}
private void printColRow(int[][] a){
    for(int i = 0; i < a[i].length; i++) {
        double sum = 0.0;
        for(int j = 0; j < a.length; j++)
                sum += a[j][i];
        System.out.println(sum + " ");
        }
}

2 个答案:

答案 0 :(得分:1)

如果数组至少有一行(a.length != 0所有行的长度相同,那么您可以这样做:< / p>

private void printColRow(int[][] a){
    for(int i = 0; i < a[0].length; i++) {
        double sum = 0.0;
        for(int j = 0; j < a.length; j++)
            sum += a[j][i];
        System.out.println(sum + " ");
    }
}

如果行可以有不同的长度(例如{{1, 2, 3}, {4}, {5, 6}}之类的东西),则需要更复杂的东西。

答案 1 :(得分:0)

与行主要顺序相反,在切换到下一行之前处理行的所有值,在列主要顺序处理列的所有值,然后切换到下一列。有关完整说明,请参阅Row-major_order。如果你有:

final int[][] array = {
    {11, 12, 13},
    {21, 22, 23}};

final int n_row = array.length;
final int n_col = array[0].length;

然后打印:

for (int i_col = 0; i_col < n_col; i_col++) {
    System.out.printf("col[%d]:", i_col);
    for (int i_row = 0; i_row < n_row; i_row++) {
        System.out.printf(" %d", array[i_row][i_col]);
    }
    System.out.println();
}

列主要顺序中的值。有三列,每列有两个值:

col[0]:11 21
col[1]:12 22
col[2]:13 23

这仅适用于矩形阵列。也就是说,每行包含相同的值计数。相反,这打印:

for (int i_row = 0; i_row < n_row; i_row++) {
    System.out.printf("row[%d]:", i_row);
    for (int i_col = 0; i_col < n_col; i_col++) {
        System.out.printf(" %d", array[i_row][i_col]);
    }
    System.out.println();
}

for java常规行主要顺序中的值:

row[0]: 11 12 13
row[1]: 21 22 23

两行,每行三个值。由于二维数组是一维数组(行),其中每个一维数组都包含一个值(一列),你可以做得更短:

for (final int[] row: array) {
    System.out.print("row:");
    for (final int val: row) {
        System.out.printf(" %d", val);
    }
    System.out.println();
}

外部循环遍历int[][],其中每行包含int[]作为值。在内部循环中迭代然后在值int[]数组上。

Java 8方式并不那么优雅,因为数组是基元数组int[]

Arrays.asList(array).forEach(row -> { for (final int val: row) System.out.println(val); });