嵌套for循环如何在多维数组上循环?

kg7wmglp  于 2021-06-29  发布在  Java
关注(0)|答案(3)|浏览(387)

这个问题有点奇怪,很难找到答案。
代码如下:

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

更具体地说,我想知道为什么 array[i][j][k].length 循环正确的次数。
在我看来,这就像是在数 [6]new int[3][2][6][8]; 什么是简单的英语翻译让我的大脑完全理解它而不是仅仅能够编码它?
我只是在用 array[i][j][k].length 举个例子。我可以问你同样的问题 array[i][j].length

xam8gpfp

xam8gpfp1#

而不是想着 array 这里是一个多维数组 int[][][][] ,将其视为一个一维数组(长度为3),包含 int[][][] s。
如何在一维数组中循环?好,

for (int i = 0; i < array.length; i++) { // for each foo in array...
    int[][][] foo = array[i];
    // do something with foo
}

现在将为每个 fooarray . 自 foo 是的另一个一维数组(长度为2) int[][] s、 我们可以用同样的方式循环:

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` 另一个一维数组(长度为6)包含 `int[]` s。让我们循环一下:

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]` ,删除变量声明的同时,您得到了问题中的嵌套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]` 来自哪里!
在我看来,这就像是在数 `[6]` 在 `new int[3][2][6][8];` 实际上是在数 `[8]` . 如果你仔细看, `array[i][j][k]` 对应于 `baz` 这里,长度是8。计算循环比计算语法中的索引更有用。它是嵌套中的第四个循环,所以它在第四维上循环,长度为8。
laik7k3q

laik7k3q2#

基本上, int[][][][] array 是一个数组,一个数组,一个数组,一个数组,一个数组 int[3][2][6][8] ,您有一个3数组2数组6数组8 int的数组。 array[i] 从名为 array . array[i][k] 给你第i个数组的第k个数组。
因此 array[i][j][k].length 从名为 array . 在这里,因为您创建了 int[3][2][6][8] ,无论i,j和k,你都会有长度 8 ,因为来自同一维度的所有数组都具有相同的大小。
我们可以把一个10 int的数组加到 array[1][1] ,然后 array[1][1].length7 以及 array[1][1][6].lengthten .
最重要的是要理解和记住 int[][][][] array 是数组的数组。所以它循环的次数是正确的,因为你不会离开数组和他的子数组(还有其他嵌套的子数组…),因为你总是有它们的长度,不会走得更远。

bihw5rsg

bihw5rsg3#

多维数组可以看作是数组的数组(数组本身可以包含数组)。阵列阵列与二维网格的区别在于,“较小”的阵列可以具有不同的长度。使用 array[i][j][k].length (例如),仅当第三维的每个数组大小相同时才起作用。假设是这样,在不同级别上查找数组的长度将返回它们各自维度的大小。

相关问题