[英]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.