在Java中将三维数组的所有值设置为零的最佳方法是什么?

我有一个三维数组,我想重置为零。 似乎应该有一个简单的方法来执行此操作,不涉及三个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; } } } 

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

  for (int[][] square : cube) { for (int[] line : square) { Arrays.fill(line, 0); } } 

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

 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似乎也在内部使用了一个循环,但它看起来通常更优雅。

好吧,似乎你可以放弃旧数组并创建一个新数组:

 int size = 10; cube = new int[size][size][size]; 
 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

好吧,你总能做到这一点:

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

它比3个循环更清洁。

如果你不明白,那么第一个“填充”就会填充一个维度。 第二个填充将一个维度复制到两个维度。 第三个填充在三个维度上复制两个维度。

如果您没有对需要保留的arrays的其他引用,则可以像其他人建议的那样重新创建它可能更快更干净。

尽管这一个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; } } 

如果所有行都是相同的长度,您可以放弃数组并构建一个新的行,因为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); } } 

只需创建一个新数组并将变量赋给它…… GC将清理旧数组