如何复制3d数组?
int[][][] save = new int[9][9][9];
System.arraycopy(p, 0, save, 0, p.length);
for (int i = 0; i < p.length; i++) {
System.arraycopy(p[i], 0, save[i], 0, p[i].length);
for (int j = 0; j < p[i].length; j++) {
System.arraycopy(p[i][j], 0, save[i][j], 0, p[i][j].length);
}
}
答案 0 :(得分:1)
请记住,Java中没有3D数组,因为Java只支持一维数组。多维数组由new
运算符伪造。请参阅Java语言规范,Run-Time Evaluation of Array Creation Expressions:
宣言:
float[][] matrix = new float[3][3];
在行为上等同于:
float[][] matrix = new float[3][]; for (int d = 0; d < matrix.length; d++) matrix[d] = new float[3];
表达式v = matrix[1][2]
实际上意味着float[] x = matrix[1]; v = x[2]
。
所以,当你做new int[9][9][9]
时,Java分配了一个包含9个引用的数组,然后分配了9个9个引用的数组,最后分配了81个9个值的数组(int[9]
)。
当您执行System.arraycopy(p, 0, save, 0, p.length)
后,您将外部9个引用替换为指向源(p
)子数组。事情真的很糟糕。
因此,Java已经为您分配了所有子数组。您只需要复制9 * 9 * 9 = 729 int
值,但不能复制任何数组。
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
System.arraycopy(p[i][j], 0, save[i][j], 0, 9);
答案 1 :(得分:0)
它不起作用,因为System.arraycopy
只是一个浅层副本。即使行
int[][][] save = new int[9][9][9];
在每个级别创建new
个对象,您立即将对九个原始数组p[0]
- p[8]
的引用转移到save
。
解决此问题的最简单方法是:
int[][][] save = new int[9][9][9];
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
for (int k = 0; k < 9; k++) // These 2 lines could be replaced by
save[i][j][k] = p[i][j][k]; // System.arraycopy as in Andreas's answer
如果int[][][]
不是矩形,这更棘手。在这种情况下,您必须执行以下操作:
int[][][] save = new int[p.length][][];
for (int i = 0; i < p.length; i++) {
save[i] = new int[p[i].length][];
for (int j = 0; j < p[i].length; j++)
save[i][j] = Arrays.copyOf(p[i][j], p[i][j].length);
}