2013-02-03 34 views
0

我想克隆列表:如何克隆二維列表?

public List<List<Test>> a = new ArrayList<List<Test>>(); 
public List<List<Test>> b = new ArrayList<List<Test>>(); 

但是,如果我做的:

b = (ArrayList<List<Test>>)a.clone(); 

發生了錯誤:

The method clone() is undefined for the type List<List<Test>> 

你能幫助我嗎?

+0

必須覆蓋的clone()來自Object。一個相關的問題是http://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java。 – user1929959

回答

1

java.util.List沒有執行Cloneable,所以編譯器不能確保你使用的具體實現。因此,它不會允許您編寫調用可能不存在的方法的代碼。

如果你知道具體的實現,你可以施放它。 V.G。如果它是一個ArrayList<List<Test>>(因爲ArrayList確實實現Cloneable),然後你做

b = (List<List<Test>>) ((ArrayList<List<Test>>) a).clone(); 

如果你不這樣做,實現自己的方法。

請記住,默認clone會生成淺拷貝。也就是說,返回的對象將是一個新的List<List<Test>>,但內部List<Test>Test不會被複制,您將獲得對原始對象的引用。

0

使用構造函數或方法addAll

new ArrayList<>(a); 
//or 
b.addAll(a); 
1

clone()不適用於抽象的名單,只爲ArrayList。然而它不會像你期望的那樣工作,因爲它只返回一個淺拷貝。爲了使一個深拷貝,你需要在一個循環中克隆:

for (List<Test> item: a) 
     b.add(new ArrayList(item); 
0

如果您使用的是Java 8中,您可以使用相同的對象與前一個創建一個新的列表簡單地使用流:

List<Double> secondList = firstList.stream().collect(Collectors.toList()); 

如果你想不與第一個共享相同的對象一個新的列表,你可以這樣做(假設你的對象實現Cloneable):

如果您使用的是Java 8中,您可以創建一個使用與前一個相同的對象的新列表,簡單地使用流:

List<Double> secondList = firstList.stream().collect(Collectors.toList()); 

如果你想不與第一個共享相同的對象一個新的列表,你可以這樣做(假設你的對象實現Cloneable):

List<Double> secondList = firstList.stream().map(v -> v.clone()).collect(Collectors.toList());