深いコピーには、属性オブジェクトを含むArrayListに問題があります。 ArrayListのdataSetをtrainingSetという名前の新しいものにコピーした後、dataという名前のAttributeの内部ArrayListのすべての内容をクリアするようにしています。私がそうすると、ArrayListのdataSetの同じ内容(dataSetのデータ)もすべてクリアされます。だから、その場合には、私は深いコピーに下記のtutsを使用して新しいものに元のリストのすべてのコンテンツを試してみました:JavaでArrayListを持つオブジェクトを含む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;
}
...
}
こんにちは、ご協力いただきありがとうございます。最初のディープコピー部分も試しましたが、私にとってはうまくいきませんでした。あなたのソリューションも試してみましたが、新しいAttributeオブジェクトを作成してデータリストに追加しました。ここでの問題は、毎回作成する属性が複数あるため、一時データArrayListをクリアする必要があることです。私がそうしているとき、一時リストの内容は新しいもので上書きされます。私はここでも浅いコピーを作成しています。 – Mike