如何复制java.util.list集合 [英] How to copy java.util.list Collection

查看:45
本文介绍了如何复制java.util.list集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在实现一个负责订购java.util.List的Java类。当我使用此类时,问题就来了。我可以订购该列表,但是我想复制原始列表而不作任何修改,这样我就可以在原始列表上注册所有更改。排序后的列表包含对象,并且其字段之一存储分类ID,并使用列表的索引值更新该ID。



我尝试使用克隆方法并保持列表未排序,但对原始列表所做的更改也会在克隆列表中更新。



有什么方法可以完成它?



我的代码:

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

Clasificacion clasificacion = new Clasificacion();

Iterator< Torero> iterTorero = clasificacion.getClasificacion(listaTorero,torero).iterator(); //排序列表

一种分类方法:

 公共列表< 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;
}
返回清单aTorero;
}


解决方案

您可以创建一个新列表像这样输入先前的列表:

 列表一= new ArrayList()
// ...添加数据,排序等
列出两个= new ArrayList(one);

这将使您可以修改顺序或包含哪些元素,而与第一个列表无关。 p>

请记住,尽管两个列表将包含相同的对象,所以如果在列表2中修改一个对象,则将在列表1中修改相同的对象。



示例:

  MyObject value1 = one.get(0); 
MyObject value2 = two.get(0);
value1 == value2 // true
value1.setName( hello);
value2.getName(); //返回你好

编辑



为避免这种情况,您需要像这样的列表中每个元素的深层副本:

  List< ; Torero>一个=新的ArrayList< Torero>(); 
//添加元素

List< Torero>两个=新的Arraylist< Torero>();
for(Torero t:一个){
Torero复制= deepCopy(t);
two.add(copy);
}

并复制以下内容:

 公共Torero deepCopy(Torero输入){
Torero复制= new Torero();
copy.setValue(input.getValue()); // ..复制基元,再次深层复制对象

返回副本;
}


I am implementing a Java class responsible for ordering java.util.List. The problem comes when I use this class. I'm able to ordering the list but I want to copy the "original" list without modification so that I could register every change made on the original list. The sorted list contains object and one of its fields stores a classification id, and this id it is updated with the index value of the list.

I tried to use clone method and it keeps the list unsorted but the changes made on original list are updated in the clone list too.

Is there any way to accomplish it?

My Code:

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

A Clasificacion method:

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;
}

解决方案

You may create a new list with an input of a previous list like so:

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

This will allow you to modify the order or what elemtents are contained independent of the first list.

Keep in mind that the two lists will contain the same objects though, so if you modify an object in List two, the same object will be modified in list one.

example:

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

Edit

To avoid this you need a deep copy of each element in the list like so:

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);
}

with copy like the following:

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

    return copy;
}

这篇关于如何复制java.util.list集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆