2012-05-04 69 views
27

我正在實現一個負責排序java.util.List的Java類。當我使用這個類時,問題就出現了。我可以訂購清單,但我想不加修改地複製「原始」清單,以便我可以註冊原清單上所做的每一項更改。排序後的列表包含對象,其中一個字段存儲分類標識,並使用列表的索引值更新此標識。如何複製java.util.list集合

我試過使用克隆方法,它使列表保持不排序,但原始列表上所做的更改也在克隆列表中更新。

有什麼辦法可以實現它嗎?

我的代碼:

List<Torero> listaTorero = tbTlgTorerolHome.findByExample(new Torero()); 
List<Torero> listaToreroTemp = ((List<Torero>) ((ArrayList<Torero>) listaTorero).clone()); 

Clasificacion clasificacion = new Clasificacion(); 

Iterator<Torero> iterTorero = clasificacion.getClasificacion(listaTorero, torero).iterator(); //Sorting List 

一個Clasificacion方法:

public List<Torero> getClasificacion(List<Torero> listaToreroTemp, Torero torero) 
{ 

    List<Torero> listaTorero = new ArrayList<Torero>(); 

    Collections.sort(listaToreroTemp,new ToreroClasifiacionComparator()); 

    Iterator<Torero> iterTorero = listaToreroTemp.iterator(); 
    int index=1; 
    while(iterTorero.hasNext()) 
    { 
     Torero toreroTemp = iterTorero.next(); 
     toreroTemp.setNumClasificacion(index); 
     listaTorero.add(toreroTemp); 
     index=index+1; 
    } 
    return listaTorero; 
} 
+1

發佈你的代碼,以便我們可以看到你在做什麼 –

+0

可能相關:[如何複製java.util.list集合?](http://stackoverflow.com/questions/10457087/how-to-copy-java -util-list-collection) –

+1

我剛剛編輯了我的問題並添加了一段代碼。 – user1260893

回答

62

您可以創建一個新的列表與前一列表,像這樣的輸入:

List one = new ArrayList() 
//... add data, sort, etc 
List two = new ArrayList(one); 

這將允許你修改訂單或者什麼elemtents包含獨立於第一名單。

請記住,兩個列表將包含相同的對象,所以如果您修改列表2中的對象,將在列表1中修改相同的對象。

例如:

MyObject value1 = one.get(0); 
MyObject value2 = two.get(0); 
value1 == value2 //true 
value1.setName("hello"); 
value2.getName(); //returns "hello" 

編輯

爲了避免這種情況,你需要每一個元素的列表中的一個深拷貝,象這樣:

List<Torero> one = new ArrayList<Torero>(); 
//add elements 

List<Torero> two = new Arraylist<Torero>(); 
for(Torero t : one){ 
    Torero copy = deepCopy(t); 
    two.add(copy); 
} 

通過類似以下的副本:

public Torero deepCopy(Torero input){ 
    Torero copy = new Torero(); 
    copy.setValue(input.getValue());//.. copy primitives, deep copy objects again 

    return copy; 
} 
+0

但是這是我想要避免的,例如,如果我更改了列表2中的值2,我不想在列表1中傳播此更改。 – user1260893

+0

啊,這改變了事情,你有一個方法或構造函數來將一個託雷羅複製到另一個託雷羅? –

+0

不,我沒有,你能給我任何線索嗎? – user1260893

20

使用ArrayList的拷貝構造函數,然後那種。

List oldList; 
List newList = new ArrayList(oldList); 
Collections.sort(newList); 

完成複製後,對newList的任何更改都不會影響oldList。

不過請注意,只有引用被複制,所以這兩個列表共享相同的對象,所以一個列表的元素進行修改影響元素其他的

+0

有沒有任何方式對複製列表的元素所做的更改沒有被傳播? – user1260893

+0

它在技術上不是傳播,因爲您有多個對同一個對象的引用。您必須製作副本(這會降低時間和空間的有效性),或者使用不可變對象(或可變對象周圍的不可變包裝)。 – Vlasec