是否有可能在没有两个循环的情况下迭代二维数组?

时间:2018-05-27 04:39:01

标签: java arrays for-loop

例如,如果我有:

int Myarray[][] = new int[][] {{1,2}, {3,4}};
for (int line=0; line < Myarray.length; line++) {
    for (int column = 0; column < Myarray[0].length; column++) {
        // do something ...
    }
}

如果没有两个循环,我怎么能通过整个数组呢?

3 个答案:

答案 0 :(得分:2)

嗯,你只能使用一个循环:

for (int i = 0; i < Myarray.length*Myarray.length; i++) {
    int row = i / Myarray.length;
    int col = i % Myarray.length;
    System.out.println(Myarray[row][col]);
}

但这假设您的2D阵列是方形的,即它的宽度和长度在任何地方都是相同的。另一种说法是2D阵列没有锯齿状。

Demo

注意:正如上面提到的@Thilo,这不会让事情变得更快。如果你需要触摸数组中的每个元素,那么我建议的代码和你当前的双循环基本上具有相同的复杂性。

答案 1 :(得分:2)

如果您不需要知道“做某事”代码中的行或列(未说明),您可以:

Arrays.stream(Myarray).flatMap(Arrays:stream)
    .forEach(n -> /* do something with “n”, the cell value */);

答案 2 :(得分:0)

您可以在没有任何循环的情况下进行迭代:

void recursive(int[][] array, int r, int c) {
  if (r >= array.length) return;
  if (c >= array[r].length) {
    recursive(array, r+1, 0);
  } else {
    System.out.println(array[r][c]);
    recursive(array, r, c+1);
  }
}

然后使用recursive(array, 0, 0)调用以开始使用。

但这样做没有实际好处。这会表现不佳,因为调用方法与增加int相关所需的额外工作。 (另外,根据数组的大小,最终可能会出现堆栈溢出)。