簡體   English   中英

如何創建ArrayList的副本 <ArrayList<Arc> &gt;到另一個ArrayList <ArrayList<Arc> &gt;

[英]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)的所有引用從rotalar1rotalar2

  • 一種方法是,您需要遍歷每個對象( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM