我正在实现一个负责排序java.util.List的Java类。当我使用这个课时,问题出现了。我能够订购列表,但我想复制“原始”列表而不进行修改,以便我可以注册原始列表中的每个更改。排序列表包含对象,其中一个字段存储分类ID,此id用列表的索引值更新。
我尝试使用克隆方法,它保持列表未排序,但在原始列表上所做的更改也会在克隆列表中更新。
有没有办法完成它?
我的代码:
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;
}
答案 0 :(得分:82)
您可以使用上一个列表的输入创建一个新列表,如下所示:
List one = new ArrayList()
//... add data, sort, etc
List two = new ArrayList(one);
这将允许您修改顺序或包含的元素,而不依赖于第一个列表。
请记住,这两个列表将包含相同的对象,因此如果您修改List 2中的对象,则同一对象将在列表一中进行修改。
示例:
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;
}
答案 1 :(得分:22)
使用ArrayList复制构造函数,然后对其进行排序。
List oldList;
List newList = new ArrayList(oldList);
Collections.sort(newList);
进行复制后,对newList的任何更改都不会影响oldList。
但是请注意,只复制引用,因此两个列表共享相同的对象,因此对一个列表的元素所做的更改会影响元素< / em>的另一个。