1

ディープコピーがどのように機能するかを理解するのに問題があります。コピーしたいこの3Dベクトルがあります。

int bands[][][] = new int[parameters.numberPredictionBands + 1][][];
int copy[][][] = new int [parameters.numberPredictionBands + 1][][];

次に、このベクトルをバンドを変更するメソッドに渡します

prepareBands(bands);

そして最後に、バンドの深いコピーを作成する必要があるので、コピーが変更されても、バンドは同じままで、その逆も同様です。

copy = copyOf3Dim(bands, copy);

私はこれらのさまざまな方法を試しましたが、うまくいかないようです

方法1:

private int[][][] copyOf3Dim(int[][][] array, int[][][]copy) {

    for (int x = 0; x < array.length; x++) {  
        for (int y = 0; y < array[0].length; y++) {  
            for (int z = 0; z < array[0][0].length; z++) {
                copy[x][y][z] = array[x][y][z];  
            }  
        }  
    } 
    return copy;
}

方法2:

private int[][][] copyOf3Dim(int[][][] array, int[][][]copy) {

    for (int i = 0; i < array.length; i++) {

        copy[i] = new int[array[i].length][];
        for (int j = 0; j < array[i].length; j++) {
            copy[i][j] = Arrays.copyOf(array[i][j], array[i][j].length);
        }
    }
    return copy;
}

方法3:

public int[][][] copyOf3Dim(int[][][] array, int[][][] copy) {

    for (int i = 0; i < array.length; i++) {
        copy[i] = new int[array[i].length][];
        for (int j = 0; j < array[i].length; j++) {
            copy[i][j] = new int[array[i][j].length];
            System.arraycopy(array[i][j], 0, copy[i][j], 0, array[i][j].length);
        }
    }
    return copy;
}    

実行するとプログラムがクラッシュすると思いますarray[i].length

何が間違っているのか教えていただけますか?

4

1 に答える 1

4

私が何度か使用して成功したディープ クローニングの一般的なトリックは、オブジェクトを にシリアル化ByteArrayOutputStreamし、すぐに逆シリアル化することです。これは最高のパフォーマーではありませんが、単純な 2 ~ 3 行のコードであり、どんな深さでも機能します。

配列はたまたまSerializableです。

final ByteArrayOutputStream out = new ByteArrayOutputStream();
new ObjectOutputStream(out).writeObject(array);
final Spec clone = (int[][][]) 
     new ObjectInputStream(new ByteArrayInputStream(out.toByteArray())).
于 2013-02-20T21:01:36.577 に答える