Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何复制java.util.list集合_Java_Clone - Fatal编程技术网

如何复制java.util.list集合

如何复制java.util.list集合,java,clone,Java,Clone,我正在实现一个负责排序Java.util.List的Java类。当我使用这个类时,问题来了。我可以对列表进行排序,但我想复制“原始”列表而不进行修改,这样我就可以注册对原始列表所做的所有更改。排序后的列表包含一个对象,它的一个字段存储一个分类id,该id将使用列表的索引值进行更新 我尝试使用克隆方法,它保持列表未排序,但对原始列表所做的更改也会在克隆列表中更新 有没有办法做到这一点 我的代码: List<Torero> listaTorero = tbTlgTorerolHome.f

我正在实现一个负责排序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
List listaTorero=tbTlgTorerolHome.findByExample(new Torero());
List listaToreroTemp=((List)((ArrayList)listaTorero.clone());
Clasificacion Clasificacion=新Clasificacion();
迭代器iterTorero=clasificacion.getClasificacion(listaTorero,torero.Iterator()//分类表
分类法:

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;
}
public List getClasificacion(List listaToreroTemp、Torero-Torero)
{
List listaTorero=new ArrayList();
Collections.sort(listaToreroTemp,new-torecolasifiaconcomparator());
迭代器iterTorero=listaToreroTemp.Iterator();
int指数=1;
while(iterTorero.hasNext())
{
Torero toreroTemp=iterTorero.next();
Torepromp.setnumclasificion(指数);
listaTorero.add(toreretemp);
指数=指数+1;
}
返回列表器;
}

使用ArrayList复制构造函数,然后对其排序

List oldList;
List newList = new ArrayList(oldList);
Collections.sort(newList);
复制后,对newList的任何更改都不会影响oldList


但是请注意,仅复制引用,因此两个列表共享相同的对象,因此对一个列表的元素所做的更改会影响另一个列表的元素。

您可以使用以前列表的输入创建一个新列表,如下所示:

List one = new ArrayList()
//... add data, sort, etc
List two = new ArrayList(one);
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);
}
这将允许您独立于第一个列表修改顺序或包含哪些元素

请记住,这两个列表将包含相同的对象,因此,如果修改列表2中的对象,则列表一中的对象将被修改

例如:

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

为了避免这种情况,您需要列表中每个元素的深度副本,如下所示:

List one = new ArrayList()
//... add data, sort, etc
List two = new ArrayList(one);
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);
}

发布您的代码,以便我们可以看到您正在做的事情可能与此相关:我刚刚编辑了我的问题并添加了一段代码。但这正是我想要避免的,例如,如果我更改列表2中的value2,我不想在列表1中传播此更改。啊,这会改变情况,您是否有方法或构造函数将一个复制到另一个?没有,我没有,你能给我一些线索吗?它可以工作,但我避免手动设置对象的每个元素。我知道还有其他选择。。。谢谢。如果您想让图书馆为您做这项工作,请查看ApacheCommonsBeanutils.cloneBean()。这使用反射将属性从一个对象复制到另一个对象。对复制列表元素所做的更改是否有任何方式不会传播?从技术上讲,这不是传播,因为您对同一对象有多个引用。您要么制作副本(这会降低时间和空间的有效性),要么使用不可变对象(或围绕可变对象的不可变包装)。