2012-11-28 79 views
-1

在Java中,我們如何複製一個3-D數組? 事情是,當我們使用new_array.clone()或類似的東西時,我們將條目地址放入another_array中,而不是實際值。 因此,當我清除()old_arraynew_array是空太在java中複製多維數組

private List<List<List<String>>> moves = new ArrayList<List<List<String>>>(); 
private List<List<List<String>>> moves1 = new ArrayList<List<List<String>>>(); 

.blah 
.blah 
.blah 

mid_array = new ArrayList<List<String>>();//will use this array to insert inot moves1 

for(int f = 0; f < moves.size(); f++)//make a copy of original array. 
{ 

    List<String> row_st = moves.get(f).get(0); 
    List<String> deck_st = moves.get(f).get(1); 

    mid_array.add(row_st);//current array of the Rows 
    mid_array.add(deck_st);//current array of the Deck 

    moves1.add(mid_array); 

    System.out.println("Moves1 "+moves1);//displays the new array correctly 

    mid_array.clear();//clear mid_array, NOT moves1 or moves arrays 

    System.out.println("Moves1 "+moves1);//new array is now empty 

} 

回答

3

在Java中,對象總是引用,所以當你做:

moves1.add(mid_array); 

這意味着mid_array添加到moves1mid_array仍引用。這樣,當你打電話給mid_array.clear()時,從兩個地方都清楚了。

如果您想維護moves1內的列表,則最好在for環內創建mid_array的新實例,例如,如下:

for(int f = 0; f < moves.size(); f++)//make a copy of original array. 
{ 
    List<List<String>> mid_array = new ArrayList<List<String>>(); 
    List<String> row_st = moves.get(f).get(0); 
    List<String> deck_st = moves.get(f).get(1); 

    mid_array.add(row_st);//current array of the Rows 
    mid_array.add(deck_st);//current array of the Deck 

    moves1.add(mid_array); 

    System.out.println("Moves1 "+moves1);//displays the new array correctly 

    //No need to clear as in each iteration, it will instantiate a new mid_array 
} 
0

通常你必須做手工深層副本(除非對象支持它爲你的文檔會告訴你)。在這種情況下,您需要使用兩個嵌套循環並克隆最底層的ArrayList

-3

那麼你可以做到醜陋的方式,如果你想。我忘了是否有一個功能來做到這一點,但如果你想手動做到這一點的方式。

int array[10][10][10] = ...// just assume they are all filled. 
    int newArray[10][10][10]; 
     for(int i = 0; i< 10; i++) 
     { 
      for(int j = 0; j< 10; j++) 
      { 
       for(int k = 0; k< 10; k++) 
       { 
        newArray[i][j][k] = array[i][j][k]; 
       } 
      } 
     } 

    array = NULL; 

這只是一個例子,可能是不正確的語法,但這種方式應該工作。我或其他任何其他人應該實際上是我的<陣列維度的長度。

-1

您可以創建ArrayList的子類並覆蓋clone()方法以執行深度複製而不是淺度複製。例如:

public class DeepCopyArrayList extends ArrayList 
{ 
    public Object clone() 
    { 
    // implement deep copy clone here 
    } 
} 

一旦你有了這個,你只需要做

myArray.clone() 
2

這將產生一個真正的副本,包括複製所有元素。

public static <T> List<List<List<T>>> list3DCopy(List<List<List<T>>> source) { 
    List<List<List<T>>> result = new ArrayList<>(source.size()); 
    Cloner cloner = new Cloner(); 
    for(List<List<T>> innerList : source) { 
     List<List<T>> copy = new ArrayList<>(innerList.size()); 
     for (List<T> innerInnerList : innerList) { 
      List<T> innerCopy = new ArrayList<>(innerInnerList.size()); 
      for (T item : innerInnerList) { 
       T clone = cloner.deepClone(item); 
       innerCopy.add(clone); 
      } 
      copy.add(innerCopy); 
     } 
     result.add(copy); 
    } 
    return result; 
} 

它使用this cloning library複製元素。

使用它,如下所示:

List<List<List<YourClass>>> original = ... 
List<List<List<YourClass>>> copy = list3DCopy(original);