如何使用单个循环运行二维数组?

时间:2015-03-23 02:03:39

标签: java loops for-loop matrix 2d

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

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循环是我的问题。

如果可能,请保持简单。谢谢!

2 个答案:

答案 0 :(得分:4)

你可以,虽然它效率低下:

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

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

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

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

答案 1 :(得分:0)

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

虽然它有点乱。我只是去寻找一个嵌套循环。