2009-05-17 4 views
1

Double型の二重リンクリストを作成していますが、同じ型の別のリンクリストを宣言しても、常に最初のリストを参照します。など参照なしでJavaでLinkedListを二重にコピーする方法はありますか?

LinkedList<LinkedList<Double>> trainingData = new LinkedList<LinkedList<Double>>(); 
LinkedList<LinkedList<Double>> newData = new LinkedList<LinkedList<Double>>(); 

は、この割り当てがあるnewDataに変更されます後、私はtrainingDataに作るものは何でも変更後

... trainingDataに

newData = trainingData; 
をいくつかのものを追加します。私はnewDataのコンストラクタでtrainingDataを渡して、newDataにtrainingDataのデータを割り当てるネストループを使用してみましたが、newDataがtrainingDataを参照しているのと同じ結果が得られます。

答えて

7

リスト内で反復し、各要素を新しいリストにコピー/クローンする必要があります。

あなたが直面している問題は、LinkedListが内部にあるの参照だけが含まれている要素にを保持していることです。リストをリストbにコピーすると、リストaのリストをリストbにコピーするので、元のリストの変更は新しくコピーされたリストに反映されます。

+0

これは権利であるようなものディープコピーです。 newData = trainingData newDataとtrainingDataは、同じリスト(trainingDataに最初に割り当てられたもの)への参照を保持します。新しいリストコピー(または新しいリスト要素)が割り当てられる/されない/引き起こされる。 –

+1

linkedListインスタンスでclone()を呼び出すだけでは、浅いコピーが作成されるため、手動の繰り返しが本当に必要であることにも注意してください。http://java.sun.com/javase/6/docs/api/java/ util/LinkedList.html#clone() – Stephan202

+1

@ Stephen202:リストの内容によっては、十分ではないかもしれません。それらが不変のオブジェクトであれば、浅いコピーは綺麗ではありませんが、好ましくは、クローン作成不可能なものはCPUとメモリの無駄です。 –

1

これは、その内容ではなく、リストへの参照をコピーするだけです。あなたが必要とするように見える何

newData = trainingData; 

は、

newData = new LinkedList(); 
for(LinkedList ll: trainingData) 
    newData.add(ll.clone());