2017-08-26 77 views
-1

我想對ArrayList進行排序,並且應該對ArrayList的副本進行排序。如何從java中的ArrayList創建新的集合

我試過以下,但它是排序一個原始列表,無論我在排序列表上做出的更改,它也反映在原始列表中。

List <Stud> list = new ArrayList<>(); 
list.add(new Stud(1,"Sachin") ); 
list.add(new Stud(2,"Niteen") ); 
Set <Stud> set = new HashSet<>(list); 
Stud s = set.iterator().next(); 
System.out.println("S:"+s); 
s.setRoll(10); 
System.out.println("list: "+list); 
System.out.println("set : "+set); 

roll no 10設置在arraylist和set中,如何避免這種情況。 如果你解釋它爲什麼會發生這很有幫助。

+2

您已在兩個集合中添加了「Stud」的相同實例。也許你應該在別的東西上調用setRoll(把可變數據從學生的(?)身份信息中分離出來)。也許套裝應該只有ID號碼?很難說,不知道更多關於你的項目。 – Thilo

+0

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

+0

而標題與你的問題沒有關係 –

回答

0

當您在集合上使用複製構造函數時,它會創建新集合並添加舊集合中的所有元素。你需要的是複製元素,爲此目的使用forEach()並創建元素的副本。

0
List <Stud> list = new ArrayList<>(); 
    list.add(new Stud(1,"Sachin") ); 
    list.add(new Stud(2,"Niteen") ); 
    Set <Stud> set = new HashSet<>(); 
    //copy using forEach 
    for(Stud s : list){ 
     set.add(new Stud(s.getRoll(),s.getName())); 
    } 
    Stud s = set.iterator().next(); 
    System.out.println("S:"+s); 
    s.setRoll(10); 
    System.out.println("list: "+list); 
    System.out.println("set : "+set); 

我不確定你的項目,但這似乎是唯一的方法。您正在創建兩個對象,並在兩個不同的集合實例中使用相同的對象。即使集合實例不同,您的下劃線對象也是一樣的。所以如果你改變它的一個屬性,它會反映你使用的所有集合實例。因此,只有通過參考上面給出的新的Stud對象才能克隆它們。

相關問題