我想知道我是否可以用一个循环而不是两个来写这个东西?
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
循环是我的问题。
如果可能,请保持简单。谢谢!
答案 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;
}
}
虽然它有点乱。我只是去寻找一个嵌套循环。