Как скопировать коллекцию java.util.list
Я реализую класс Java, ответственный за заказ java.util.List. Проблема возникает, когда я использую этот класс. Я могу заказать список, но я хочу скопировать "оригинальный" список без изменений, чтобы я мог регистрировать каждое изменение, внесенное в исходный список. Сортированный список содержит объект, и одно из его полей хранит идентификатор классификации, и этот идентификатор обновляется значением индекса списка.
Я попытался использовать метод clone, и он сохраняет список несортированным, но изменения, внесенные в исходный список, также обновляются в списке клонов.
Есть ли способ сделать это?
Мой код:
List<Torero> listaTorero = tbTlgTorerolHome.findByExample(new Torero());
List<Torero> listaToreroTemp = ((List<Torero>) ((ArrayList<Torero>) listaTorero).clone());
Clasificacion clasificacion = new Clasificacion();
Iterator<Torero> iterTorero = clasificacion.getClasificacion(listaTorero, torero).iterator(); //Sorting List
Метод Clasificacion:
public List<Torero> getClasificacion(List<Torero> listaToreroTemp, Torero torero)
{
List<Torero> listaTorero = new ArrayList<Torero>();
Collections.sort(listaToreroTemp,new ToreroClasifiacionComparator());
Iterator<Torero> iterTorero = listaToreroTemp.iterator();
int index=1;
while(iterTorero.hasNext())
{
Torero toreroTemp = iterTorero.next();
toreroTemp.setNumClasificacion(index);
listaTorero.add(toreroTemp);
index=index+1;
}
return listaTorero;
}
Ответы
Ответ 1
Вы можете создать новый список со входом предыдущего списка, например:
List one = new ArrayList()
//... add data, sort, etc
List two = new ArrayList(one);
Это позволит вам изменить порядок или элементы, которые содержатся независимо от первого списка.
Имейте в виду, что эти два списка будут содержать одни и те же объекты, поэтому, если вы измените объект в списке два, тот же объект будет изменен в первом списке.
Пример:
MyObject value1 = one.get(0);
MyObject value2 = two.get(0);
value1 == value2 //true
value1.setName("hello");
value2.getName(); //returns "hello"
Edit
Чтобы этого избежать, вам нужна глубокая копия каждого элемента в списке:
List<Torero> one = new ArrayList<Torero>();
//add elements
List<Torero> two = new Arraylist<Torero>();
for(Torero t : one){
Torero copy = deepCopy(t);
two.add(copy);
}
с копией, как показано ниже:
public Torero deepCopy(Torero input){
Torero copy = new Torero();
copy.setValue(input.getValue());//.. copy primitives, deep copy objects again
return copy;
}
Ответ 2
Используйте конструктор копирования ArrayList, а затем выполните сортировку.
List oldList;
List newList = new ArrayList(oldList);
Collections.sort(newList);
После создания копии любые изменения в newList не влияют на oldList.
Обратите внимание, однако, что копируются только ссылки, поэтому в двух списках используются одни и те же объекты, поэтому изменения, внесенные в элементы одного списка, влияют на элементы другого.