使用Java中的ArrayLists深度复制包含对象的ArrayList

时间:2017-11-17 18:19:50

标签: java arraylist

我有一个问题是深度复制包含Attribute对象的ArrayList。在我将一个名为trainingSet的新ArrayList数据集复制之后,我试图清除(trainingSet)属性内部ArrayList的所有内容,称为data。当我这样做时,ArrayList dataSet(dataSet的数据)的所有相同内容也被清除。所以在这种情况下,我尝试使用以下内容将原始列表的所有内容深度复制到新的内容:

  1. http://javarevisited.blogspot.gr/2014/03/how-to-clone-collection-in-java-deep-copy-vs-shallow.html#axzz4ybComIhC

  2. https://beginnersbook.com/2013/12/how-to-clone-an-arraylist-to-another-arraylist/

  3. How to make a deep copy of Java ArrayList

  4. 但我有同样的行为。那么有人可以告诉我如何解决这个问题以及错误的想法在哪里?

    感谢您的帮助。

      

    ID3Algorithm.java

    ...
    ArrayList<Attribute> dataSet = new ArrayList<dataSet>();
    ArrayList<Attribute> trainingSet = new ArrayList<Attribute>(dataSet);
    
    for(Attribute att : trainingSet) {
      att.GetData().clear();  // At this point all the data in dataSet are cleared,too.
    }
    ...
    
      

    Attribute.java

    public class Attribute
    {
      private String name;  
      private ArrayList<String> branchNames = new ArrayList<String>();      
      private ArrayList<String> data = new ArrayList<String>(); 
      private ArrayList<Branch> branches = new ArrayList<Branch>(); 
      private HashMap<String, Integer> classes = new HashMap<String, Integer>();
      private ID3Algorithm id3;
      private Leaf leaf = null;
    
      public ArrayList<String> GetData() { return data; }
    
      public Attribute(String attribName, ArrayList<String> attribBranchNames, ArrayList<String> attribData, ID3Algorithm algo) {
        name = attribName;
        branchNames = attribBranchNames;
        data = attribData;
        id3 = algo;             
      }
      ...
    }
    

1 个答案:

答案 0 :(得分:0)

为trainingSet分配值时

ArrayList<Attribute> trainingSet = new ArrayList<Attribute>(dataSet);

您只是将现有属性的引用传递给新列表。它不是不同属性对象的新列表。您发布的第一个链接详细描述了此过程。我会深入阅读它。(第一个例子是浅拷贝)

http://javarevisited.blogspot.gr/2014/03/how-to-clone-collection-in-java-deep-copy-vs-shallow.html#axzz4ybComIhC

所以当你打电话

att.GetData().clear();

您正在清除原始属性对象数据(哪个数据集也引用)

尝试创建新的Attribute对象并为每个对象分配新数据(从原始复制),然后将其添加到trainingSet列表中。