我有一个三维数组,我想重置为零。似乎应该有一个简单的方法来执行此操作,不涉及三个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;
}
}
}
答案 0 :(得分:29)
如果您使用的是JDK 1.5或更高版本:
for (int[][] square : cube) {
for (int[] line : square) {
Arrays.fill(line, 0);
}
}
答案 1 :(得分: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似乎也在内部使用了一个循环,但它看起来更优雅。
答案 2 :(得分:13)
好吧,似乎你可以放弃旧数组并创建一个新数组:
int size = 10;
cube = new int[size][size][size];
答案 3 :(得分: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
。
答案 4 :(得分: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;
}
}
答案 5 :(得分:2)
嗯,你总是可以这样做:
Arrays.fill(cube[0][0],0);
Arrays.fill(cube[0],cube[0][0]);
Arrays.fill(cube,cube[0]);
它比3个循环更清洁。
如果你不明白,第一个“填充”就会填充一个维度。第二个填充将一个维度复制到两个维度。第三个填充在三个维度上复制两个维度。
如果您没有其他需要保留的数组引用,则可以像其他人建议的那样重新创建它可能更快更干净。
答案 6 :(得分: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);
}
}
答案 7 :(得分:1)
只需创建一个新数组并将变量赋值给它...... GC将清理旧数组