2016-03-14 33 views
0

如果我有一个二维数组并且不知道大小。我如何处理它在列主要顺序没有抛出异常?我的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 + " "); 
     } 
} 
+1

添加'I

+0

我不明白。你能解释一下吗? – dcrearer

回答

1

如果阵列具有至少一行(a.length != 0所有行具有相同的长度,那么你可以做这样的:

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}}),那么需要更复杂的东西。

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(); 
} 

在对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); });