[英]How do nested for loops loop over muldimensional arrays?
这是一个有点奇怪的问题,很难找到答案。
这是代码:
int[][][][] array = new int[3][2][6][8];
int x = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
for (int k = 0; k < array[i][j].length; k++) {
for (int n = 0; n < array[i][j][k].length; n++) {
array[i][j][k][n] = ++x;
}
}
}
}
这一行发生了什么:
array[i][j][k].length
更具体地说,我想知道为什么这个 line array[i][j][k].length
循环正确的次数。
对我来说,它看起来像是在计算 new int[3][2][ [6]
new int[3][2][6][8];
让我的头脑完全理解它而不是仅仅能够编码它的简单英语翻译是什么?
我只是以array[i][j][k].length
为例。 我可以对array[i][j].length
提出同样的问题
与其将此处的array
视为多维数组int[][][][]
,不如将其视为包含int[][][]
的一维数组(长度为 3)。
你如何循环遍历一维数组? 出色地,
for (int i = 0; i < array.length; i++) { // for each foo in array...
int[][][] foo = array[i];
// do something with foo
}
现在将对array
中的每个foo
执行一些操作。 由于foo
是另一个int[][]
的一维数组(长度为 2),我们可以用同样的方式循环它:
for (int i = 0; i < array.length; i++) { // for each foo in array...
int[][][] foo = array[i];
for (int l = 0 ; i < foo.length ; j++) { // for each bar in foo...
int[][] bar = foo[j];
// do something with bar...
}
}
bar
是另一个包含int[]
的一维数组(长度为 6)。 让我们也循环一下:
for (int i = 0; i < array.length; i++) { // for each foo in array...
int[][][] foo = array[i];
for (int j = 0 ; j < foo.length ; j++) { // for each bar in foo...
int[][] bar = foo[j];
for (int k = 0 ; k < bar.length ; k++) { // for each baz in bar...
int[] baz = bar[k];
// do something with baz...
}
}
}
最后我们循环遍历baz
,它也是一个整数的一维数组(长度为 8):
for (int i = 0; i < array.length; i++) { // for each foo in array...
int[][][] foo = array[i];
for (int j = 0 ; j < foo.length ; j++) { // for each bar in foo...
int[][] bar = foo[j];
for (int k = 0 ; k < bar.length ; k++) { // for each baz in bar...
int[] baz = bar[k];
for (int n = 0 ; n < baz.length ; n++) { // for each number in baz...
// do something with baz[n]
}
}
}
}
现在这里是“魔术”。 注意变量赋值:
foo = array[i];
bar = foo[j];
baz = bar[k];
如果您将baz
替换为bar[k]
,然后将bar
替换为foo[j]
,然后将foo
替换为array[i]
,删除 go 时的变量声明,您将得到问题中的嵌套 for 循环!
例如,这是baz[n]
的逐步可视化:
baz[n]
bar[k][n] // replace baz with bar[k]
foo[j][k][n] // replace bar with foo[j]
array[i][j][k][n] // replace foo with array[i]
这就是array[i][j][k][n]
的来源!
对我来说,它看起来像是在计算 new int[3][2][
[6]
new int[3][2][6][8];
它实际上是在计算[8]
。 如果您仔细观察, array[i][j][k]
对应于此处的baz
,其长度为 8。计算循环可能比语法中的索引更有用。 它是嵌套中的第四个循环,因此它在长度为 8 的第四维上循环。
多维数组可以被认为是 arrays 的数组(它们本身可以包含数组)。 arrays 数组与二维网格的区别在于“较小的” arrays 可以具有不同的长度。 使用array[i][j][k].length
(例如),仅当第三维的每个数组的大小相同时才有效。 假设是这种情况,在不同级别查找 arrays 的长度将返回它们各自维度的大小。
基本上, int[][][][] array
是 int 的 arrays 的 arrays 的数组。 所以在这里,对于int[3][2][6][8]
,您有一个 3 arrays 的数组,其中 2 个 arrays 的 6 个 arrays 的 8 intCZ。
array[i]
为您提供名为array
的变量中的第 i 个数组。 array[i][k]
给你第 i 个数组的第 k 个数组。
因此array[i][j][k].length
为您提供名为array
的变量中第 i 个数组的第 j 个数组的第 k 个数组的长度。 在这里,由于您从int[3][2][6][8]
创建了所有数组,因此无论 i、j 和 k,您将始终拥有长度8
,因为来自同一维度的所有 arrays 都具有大小相同。
我们可以将一个 10 int 的整个数组添加到array[1][1]
,然后array[1][1].length
将是7
并且array[1][1][6].length
将是ten
。
要理解和记住的最重要的事情是int[][][][] array
是 arrays 的数组。 所以它循环了正确的次数,因为你没有离开数组和他的子数组(以及他的其他嵌套子数组......),因为你总是有它们的长度并且不会进一步 go。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.