【问题标题】:How to run through a 2d array with a single loop?如何通过单个循环运行二维数组?
【发布时间】:2015-03-23 02:03:39
【问题描述】:

我想知道我是否可以用一个循环而不是两个循环来写这个东西?

for (int row = 0; row < matrix.length; row++) {
        for (int col = 0; col < matrix[0].length; col++) {
            if ((row + col) % 2 == 0) {
                System.out.print(matrix[row][col] + ", ");

                sum += matrix[row][col];
            }
        }

        System.out.println("with a sum of " + sum);
    }

实际上只是忽略循环的主体。这完全无关紧要,我不知道为什么要包含它。如何以某种方式组合两个 for 循环是我的问题。

尽可能保持简单。谢谢!

【问题讨论】:

    标签: java loops for-loop matrix 2d


    【解决方案1】:

    你可以,虽然效率低:

    for(int i = 0 ; i < matrix.length * matrix[0].length ; i++)
         sum += matrix[i % matrix.length][i / matrix.length];
    

    基本思想是将每个索引映射到二维数空间中的一个值,使用我们知道数组中每个“行”的长度这一事实 (matrix.length)。我们可以组成一个索引,通过z = x + y * matrix.length 唯一标识两个索引matrix[x][y]。与此相反的是:

    x = z % matrix.length
    y = z / matrix.length
    

    此描述将是完整的,例如[0 , matrix.length * matrix[0].length) 中的每个 z 将准确识别一对索引,因此我们可以在这里使用它。

    【讨论】:

      【解决方案2】:

      Paul's answer 最初是我的想法。但是有一个小限制,你需要一个矩形二维数组(即子数组都是相同的长度)。如果您正在对“矩阵”建模,可能会出现这种情况,但更一般地,您可能希望对非矩形数组求和。

      解决此问题的方法是执行以下操作:

      for (int r = 0, c = 0; r < matrix.length;) {
        if (c < matrix[r].length) {
          sum += matrix[r][c];
          ++c;
        } else {
          c = 0;
          ++r;
        }
      }
      

      虽然有点乱。我会选择嵌套循环。

      【讨论】:

        猜你喜欢
        • 2020-12-08
        • 1970-01-01
        • 2013-12-23
        • 1970-01-01
        • 2020-05-15
        • 2020-10-08
        • 1970-01-01
        • 1970-01-01
        • 2018-07-02
        相关资源
        最近更新 更多