[英]How to create a copy of ArrayList<ArrayList<Arc>> to another ArrayList<ArrayList<Arc>>
我有一堂课
public class Arc{
...
}
和2 ArrayList
ArrayList<ArrayList<Arc>> rotalar1 = new ArrayList<ArrayList<Arc>>();
ArrayList<ArrayList<Arc>> rotalar2 = new ArrayList<ArrayList<Arc>>();
我尝试将rotalar1复制到rotalar2中:
rotalar2.addAll(rotalar1);
但我有一个问题。 如果我对rotalar2
进行了任何更改,它也会对rotalar1
产生影响。 我不想在rotalar1
进行更改:
这些行造成问题
rotalar2.get(random1).remove(random3);
rotalar2.get(random2).remove(random4);
谢谢你的时间
方法addAll
浅表复制,这意味着它将对象(不是实际Object)的所有引用从rotalar1
到rotalar2
。
Arc
)并将其克隆并将其添加到新列表中。 遍历rotalar1,将此列表的每个列表复制到rotalar2。 您可以用不同的方式制作副本。 在第一个示例中,我使用构造函数并使用相同的元素创建一个新列表。 请注意,如果对Arc
对象进行更改,则此更改在两个列表中仍将生效。 如果您不希望这样做,则也必须复制Arc
对象。
ArrayList<ArrayList<Arc>> rotalar1 = new ArrayList<ArrayList<Arc>>();
ArrayList<ArrayList<Arc>> rotalar2 = new ArrayList<ArrayList<Arc>>();
for(ArrayList<Arc> list : rotalar1)
{
rotalar2.add(new ArrayList<Arc>(list));
}
这是使用Collections.copy(dest,src)
另一种方法
for(ArrayList<Arc> list : rotalar1)
{
ArrayList<Arc> copy = new ArrayList<>();
Collections.copy(copy, list); //or copy.addAll(list);
rotalar2.add(copy);
}
现在解决此问题:
rotalar2.get(random1).remove(random3);
rotalar2.get(random2).remove(random4);
但这仍将在两个列表上均生效:
rotalar2.get(rndList).get(rndArc).set(xvy)
如果您也想解决此问题,则可以执行以下操作:
ArrayList<ArrayList<Arc>> rotalar1 = new ArrayList<ArrayList<Arc>>();
ArrayList<ArrayList<Arc>> rotalar2 = new ArrayList<ArrayList<Arc>>();
for(ArrayList<Arc> list : rotalar1)
{
ArrayList<Arc> tmpList = new ArrayList<>();
for(Arc arcObj : list)
{
tmpList.add(copyOfyourArc); //TODO how do you want to creat a copy of Arc obj?
}
rotalar2.add(tmpList);
}
您没有深度复制列表。
问题是您的列表包含对对象的引用。 如果将该引用(列表)复制到第二个列表,则两个引用(原始引用和复制的引用)都指向同一对象。 通过第二个列表中的引用应用于对象的每个更改,也将在第一个列表中可见。
要深层复制集合,您可以例如对其进行迭代并手动复制每个索引。
您应该实现自己的方法以在Arc类中进行深层复制。 该方法应创建该对象的新实例,并将所有字段(属性)设置为当前对象具有的值。 此方法应返回一个新的Arc类型的Object,该对象的所有值都与尝试复制的对象相同。 然后,您应该遍历您的arraylist,并在每个对象上使用copy方法,然后将新对象添加到新的arraylist中,这将是原始arraylist的副本。 例:
//I don't know the attributes of your Arc class this is just an example
public Arc deepCopy()
{
Arc copyOfArc = new Arc(this.field, this.field2, this.field3, this.field4, etc...);
//if you don't set everything in the constructor then you should use your setters here.
copyOfArc.setField5(this.Field5);
etc...
return copyOfArc;
}
使用此方法可以遍历数组列表并将每个弧对象复制到新的数组列表。
这是使用deepCopy()方法将对象复制到新的arraylist的示例:
ArrayList<ArrayList<Arc>> rotalar2 = new ArrayList<ArrayList<Arc>>();
int counter = 0;
for(ArrayList<Arc> temp : rotalar1)
{
rotalar2.add(new ArrayList<Arc>());
for(Arc temp1 : temp)
{
rotalar2.get(counter).add(temp1.deepCopy());
}
counter++;
}
这将使用deepCopy将arraylist rotalar1复制到arraylist rotalar2,因此每个arraylist将具有其自己的对象,并且不再相互影响。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.