我有一个问题是深度复制包含Attribute对象的ArrayList。在我将一个名为trainingSet的新ArrayList数据集复制之后,我试图清除(trainingSet)属性内部ArrayList的所有内容,称为data。当我这样做时,ArrayList dataSet(dataSet的数据)的所有相同内容也被清除。所以在这种情况下,我尝试使用以下内容将原始列表的所有内容深度复制到新的内容:
https://beginnersbook.com/2013/12/how-to-clone-an-arraylist-to-another-arraylist/
但我有同样的行为。那么有人可以告诉我如何解决这个问题以及错误的想法在哪里?
感谢您的帮助。
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;
}
...
}
答案 0 :(得分:0)
为trainingSet分配值时
ArrayList<Attribute> trainingSet = new ArrayList<Attribute>(dataSet);
您只是将现有属性的引用传递给新列表。它不是不同属性对象的新列表。您发布的第一个链接详细描述了此过程。我会深入阅读它。(第一个例子是浅拷贝)
所以当你打电话
att.GetData().clear();
您正在清除原始属性对象数据(哪个数据集也引用)
尝试创建新的Attribute对象并为每个对象分配新数据(从原始复制),然后将其添加到trainingSet列表中。