2009-05-17 4 views
1

Я создаю несколько связанных ссылок типа Double и независимо от того, как я объявляю другой связанный список того же типа, он всегда относится к первому списку.Есть ли способ скопировать дважды LinkedList в Java без ссылки?

Такие, как:

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

Добавить некоторые вещи trainingData ...

newData = trainingData; 

Тогда любые изменения, которые я сделать, чтобы trainingData после этого назначения получает изменилось в NewData. Я также пробовал передать trainingData в конструкторе newData и использовать вложенный цикл, чтобы назначить данные trainingData для newData, но он по-прежнему дает мне те же результаты, что и newData, ссылки на trainingData.

ответ

7

Вам необходимо выполнить итерирование внутри ваших списков и скопировать/клонировать каждый элемент в новые списки.

Проблема, с которой вы сталкиваетесь, заключается в том, что LinkedList сохраняет только внутренние ссылки на элементы, которые он содержит. Когда вы скопируете список a в список b, то, что вы действительно делаете, копирует ссылки внутри списка a в список b, поэтому любые изменения в исходном списке отражаются на вновь скопированном списке.

+0

Это правильно. newData = trainingData приводит к тому, что newData и trainingData содержат ссылку на тот же список (тот, который первоначально был назначен для TrainingData). Это делает/not/выдает новую копию списка (или новые элементы списка). –

+1

Также обратите внимание, что ручная итерация действительно необходима, потому что вызова clone() в экземпляре linkedList недостаточно, поскольку он делает только мелкую копию: http://java.sun.com/javase/6/docs/api/java/ util/LinkedList.html # clone() – Stephan202

+1

@ Stephen202: может быть или не быть достаточно, в зависимости от содержимого списка; если они являются неизменяемыми объектами, то мелкая копия является не только прекрасной, но и предпочтительной, так как клонирование неизменяемых является пустой тратой процессора и памяти. –

1

Это просто копирует ссылку на список, а не его содержимое.

newData = trainingData; 

Что вы, кажется, нужна глубокая копия, что-то вроде

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