System.arraycopy()的Java拷贝数组3d

时间:2015-11-08 01:33:49

标签: java arrays

如何复制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);
    }
}

2 个答案:

答案 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);
}