Подтвердить что ты не робот

Как скопировать коллекцию 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;
}
4b9b3361

Ответ 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.

Обратите внимание, однако, что копируются только ссылки, поэтому в двух списках используются одни и те же объекты, поэтому изменения, внесенные в элементы одного списка, влияют на элементы другого.