【问题标题】:Is it possible to iterate through a two-dimensional array without two loops for?是否可以在没有两个循环的情况下遍历二维数组?
【发布时间】:2018-05-27 04:39:01
【问题描述】:

例如,如果我有:

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 ...
    }
}

如果没有两个循环,我怎么能遍历整个数组?

【问题讨论】:

  • 没有。但是两个循环有什么问题?总迭代次数将相同。
  • 如果你能保证所有组件数组的长度相同且不为空,你可以做for (i in [0... cols*rows]) { (x,y) = transformIndex }。但又一次:为什么?您可以考虑使用一维数组。
  • 问题是我正在研究是否有办法降低这个问题的渐近复杂度“O(n^2)”。
  • 只要总迭代次数相同,这对您的渐近复杂度没有任何作用。
  • 您需要知道“做某事”代码中的行值和列值,还是只需要每个单元格的值?

标签: java arrays for-loop


【解决方案1】:

你可以只使用一个循环:

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

但这假设你的二维数组是正方形的,即它的宽度和长度在任何地方都是相同的。另一种说法是二维数组不是锯齿状的。

Demo

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

【讨论】:

  • 你是对的。但是,为了在文章中进行演示,更有趣的是,解决方案是 O(n)。
  • 什么?如果循环需要 n*n = n^2 次迭代,你怎么能说解决方案是 O(n)?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    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 所涉及的所有额外工作。 (另外,根据数组的大小,最终可能会出现堆栈溢出)。

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      • 2016-05-12
      相关资源
      最近更新 更多