2017-11-17 11 views
-1

深いコピーには、属性オブジェクトを含むArrayListに問題があります。 ArrayListのdataSetをtrainingSetという名前の新しいものにコピーした後、dataという名前のAttributeの内部ArrayListのすべての内容をクリアするようにしています。私がそうすると、ArrayListのdataSetの同じ内容(dataSetのデータ)もすべてクリアされます。だから、その場合には、私は深いコピーに下記のtutsを使用して新しいものに元のリストのすべてのコンテンツを試してみました:JavaでArrayListを持つオブジェクトを含むArrayListを詳細コピーします

  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

しかし、私は同じ動作をしました。だから、誰かが私にこの問題を解決する方法と間違った考え方がどこにあるのか教えてもらえますか?

ありがとうございました。

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

あなたは

ArrayList<Attribute> trainingSet = new ArrayList<Attribute>(dataSet); 
をトレーニングセットに値を代入しています

既存の属性の参照を新しいリストに渡すだけです。これは、異なる属性オブジェクトの新しいリストではありません。投稿する最初のリンクは、このプロセスを詳しく説明しています。私は深さでそれを再読み込みします。あなたはまた、どのデータセット(あなたはorginal属性をクリアしている

att.GetData().clear(); 

は、データオブジェクトを呼び出すときに

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

(最初の例は、浅いコピーです)参照)

新しいAttributeオブジェクトを作成し、それぞれに新しいデータを割り当てて(オリジナルからコピーして)、それらをtrainingSetリストに追加してみてください。

+0

こんにちは、ご協力いただきありがとうございます。最初のディープコピー部分も試しましたが、私にとってはうまくいきませんでした。あなたのソリューションも試してみましたが、新しいAttributeオブジェクトを作成してデータリストに追加しました。ここでの問題は、毎回作成する属性が複数あるため、一時データArrayListをクリアする必要があることです。私がそうしているとき、一時リストの内容は新しいもので上書きされます。私はここでも浅いコピーを作成しています。 – Mike

関連する問題