2017-08-26 76 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对象才能克隆它们。

相关问题