2013-02-20 2 views
1

딥 복사가 작동하는 방식을 이해하는 데 문제가 있습니다. 나는 복사하고 싶은이 3d 벡터를 가지고있다.딥 복사 3 차원 배열

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

은 그럼 복사가 같은과 viceversa에 밴드를 유지 변경 때문에 때, 밴드

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

무엇이 잘못 되었습니까?

+3

array [i]가 null 인 경우, 즉 하위 배열이 없을 때 충돌이 발생합니다. – Ingo

답변

3

딥 복제를위한 일반적인 트릭 나는 여러 번 성공적으로 객체를 ByteArrayOutputStream으로 직렬화 한 다음 imeriely deserialize하는 것입니다. 최고의 연기자는 아니지만 간단하게 2 ~ 3 줄의 코드이며 어느 깊이까지 작동합니다.

배열은 Serializable입니다.

final ByteArrayOutputStream out = new ByteArrayOutputStream(); 
new ObjectOutputStream(out).writeObject(array); 
final Spec clone = (int[][][]) 
    new ObjectInputStream(new ByteArrayInputStream(out.toByteArray())). 
+0

예제를 제공해 줄 수 있습니까? 나는 그것을 이해하지 못한다. – strv7