11

我有一个要重置为零的三维数组。似乎应该有一种不涉及三个for循环的简单方法:

for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        for (int k = 0; k < n; k++) {
            cube[i][j][k] = 0;
        }
    }
}
4

8 回答 8

29

如果您使用的是 JDK 1.5 或更高版本:

    for (int[][] square : cube) {
        for (int[] line : square) {
            Arrays.fill(line, 0);
        }
    }
于 2009-05-14T14:23:15.220 回答
14

初始化后数组将用零填充:

int[][][] cube = new int[10][20][30];

这你也可以稍后再做,将它们的数组重置为零,它不限于声明:

cube = new int[10][20][30];

只需创建一个新数组,它用零初始化。如果您有一个地方保存对数组的引用,则此方法有效。不要关心旧数组,那将被垃圾收集。

如果您不想依赖语言的这种行为,或者您无法替换所有出现的对旧数组的引用,那么您应该使用jjnguy 提到的Arrays.fill() :

for (int i = 0; i < cube.length; i++)
{
   for (int j = 0; j < cube[i].length; j++)
   {
      Arrays.fill(cube[i][j], 0);
   }
}

Arrays.fill 似乎也在内部使用了一个循环,但它通常看起来更优雅。

于 2009-05-14T14:07:41.530 回答
13

好吧,看来您可以放弃旧数组并创建一个新数组:

int size = 10;
cube = new int[size][size][size];
于 2009-05-14T14:09:25.253 回答
5
for (int i = 0; i < arr.length; i++){
    for (int j = 0; j < arr[i].length){
        Arrays.fill(arr[i][j], 0);
    }
}

这样你就可以使用Arrays.fill摆脱一个额外的循环;

或者

arr = new double[arr.length][arr[0].length][arr[0][0].length];

不幸的是,这假设数组至少是length >= 1.

于 2009-05-14T14:08:08.127 回答
2

尽管这一个 3D 数组,但最具可读性的解决方案通常是最好的(最好是一个主观的词,就某些属性而言,您应该说最好,而可读性通常是我的首选)。

如果内部循环中真的只有三个元素,并且你想强调有三列,你可以试试这个:

for (int i = 0; i < n; i++) { 
    for (int j = 0; j < n; j++) { 
        cube[i][j][0] = 0; 
        cube[i][j][1] = 0; 
        cube[i][j][2] = 0; 
    }
}
于 2009-05-14T14:13:16.540 回答
2

好吧,你总是可以这样做:

Arrays.fill(cube[0][0],0);
Arrays.fill(cube[0],cube[0][0]);
Arrays.fill(cube,cube[0]);

它比 3 个循环要干净一些。

如果你不明白,第一个“填充”会填充一个维度。第二个填充跨二维复制该一维。第三个填充跨三个维度复制两个维度。

如果您没有对需要保留的数组的其他引用,则按照其他人的建议重新创建它可能会更快、更干净。

于 2009-05-14T16:40:17.840 回答
1

如果所有行的长度相同,您可以丢弃该数组并构建一个新数组,因为 int 元素的默认值为零。

cube = new int[cube.length][cube[0].length][cube[0][0].length];

或者你可以做

for(int[][] tda : cube ) {
  for(int[] oda : tda) {
    java.util.Arrays.fill(oda, 0);
  }
}
于 2009-05-14T14:16:39.277 回答
1

只需创建一个新数组并将变量分配给它... GC 将清理旧数组

于 2009-05-17T20:15:57.760 回答