我想对ArrayList进行排序,并且应该在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 );
在arraylist和set中都设置了10号滚动,如何避免这种情况。 如果你解释它为什么会发生这种情况会很有帮助。
答案 0 :(得分:0)
在集合上使用复制构造函数时,它会创建新集合并添加旧集合中的所有元素。你需要的是复制元素,为此目的使用forEach()并创建元素的副本。
答案 1 :(得分: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 对象来克隆它们。