2014-03-27 140 views
0

我檢查了其他答案,但我找不到我的問題的正確答案。 我想創建一個我的ArrayList<ArrayList>的副本,因爲我需要原來的其他地方。我用不同的方式.clone()方法:JAVA的ArrayList <Arraylist>的深拷貝

public class WordChecker { 

    private ArrayList<ArrayList> copyOfList = new ArrayList<ArrayList>(); 

    public WordChecker(ArrayList<ArrayList> list) { 
     for (int i = 0; i < list.size(); i++) 
      for (int j = 0; j < 7; j++) 
       copyOfList = (ArrayList<ArrayList>) list.clone(); // without error 
       // copyOfList = list.clone();cannot convert from Object to 
       // ArrayList<ArrayList> 
       // copyOfList = list.get(i).clone();cannot convert from Object to 
       // ArrayList<ArrayList> 
       // copyOfList = list.get(i).get(j).clone(); 
    } 

但是我的主要ArrayList變化我在它的副本。 有沒有人可以告訴我在這種情況下應該如何獲得深層複製?

答: 我把複製機制在我的類的構造函數:

private ArrayList<List> checkedTags = new ArrayList<List>(); 
public WordChecker(ArrayList<ArrayList> list) 
    { 
    for (ArrayList word: list) copyOfList.add((ArrayList) word.clone()); 

} 

唯一的問題是,這並不適用於從ArrayList中,這使我經過一個for循環使用複製。 get()方法。我覺得它們在最後基本相同。

+2

的元素,不要使用克隆()。使用另一個集合作爲參數的ArrayList構造函數。如果您想要深度複製,則需要循環。 –

+0

看看這裏:http://stackoverflow.com/questions/715650/how-to-clone-arraylist-and-also-clone-its-contents –

+0

我做了一個嵌套循環來達到內部ArrayList中的每個項目。它會拋出代碼前面提到的錯誤。我用這個代碼:>> for(ArrayList word:list)copyOfList.add(word.clone())...也是。 但它不能接受.add。 – msc87

回答

-1

您可以簡單地使用ArrayList(Collection c)構造

public <T> ArrayList<ArrayList<T>> deepCopy(ArrayList<ArrayList<T>> source) { 
    ArrayList<ArrayList<T>> dest = new ArrayList<ArrayList<T>>(); 
    for(ArrayList<T> innerList : source) { 
     dest.add(new ArrayList<T>(innerList)); 
    } 
    return dest; 
} 

注意: 正如@Tim B中提及這並不深副本中的ArrayList

+10

請注意,雖然這將深層複製列表,但它不會深入複製列表中的項目。 –

+0

我在編輯我的帖子時做了。我不擅長使用泛型方法...:D – msc87

+0

如果它不深拷貝列表的元素,那麼它的深度不夠深。 – Vatsal