web-dev-qa-db-fra.com

Comment copier la collection Java.util.list

J'implémente une classe Java responsable de la commande de Java.util.List. Le problème survient lorsque j'utilise cette classe. Je suis en mesure de commander la liste mais je veux copier l'original " list sans modification afin que je puisse enregistrer chaque modification apportée à la liste d'origine.La liste triée contient un objet et l'un de ses champs stocke un identifiant de classification, et cet identifiant est mis à jour avec la valeur d'index de la liste.

J'ai essayé d'utiliser la méthode de clonage et elle conserve la liste non triée, mais les modifications apportées à la liste d'origine sont également mises à jour dans la liste de clonage.

Y a-t-il un moyen de le faire?

Mon code:

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

Une méthode de classification:

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;
}
40
user1260893

Vous pouvez créer une nouvelle liste avec une entrée d'une liste précédente comme ceci:

List one = new ArrayList()
//... add data, sort, etc
List two = new ArrayList(one);

Cela vous permettra de modifier l'ordre ou quels éléments sont contenus indépendamment de la première liste.

N'oubliez pas que les deux listes contiendront les mêmes objets. Par conséquent, si vous modifiez un objet dans la liste deux, le même objet sera modifié dans la liste un.

exemple:

MyObject value1 = one.get(0);
MyObject value2 = two.get(0);
value1 == value2 //true
value1.setName("hello");
value2.getName(); //returns "hello"

Éditer

Pour éviter cela, vous avez besoin d'une copie complète de chaque élément de la liste, comme ceci:

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);
}

avec copie comme suit:

public Torero deepCopy(Torero input){
    Torero copy = new Torero();
    copy.setValue(input.getValue());//.. copy primitives, deep copy objects again

    return copy;
}
83
John Ericksen

Utilisez le constructeur de copie ArrayList, puis triez-le.

List oldList;
List newList = new ArrayList(oldList);
Collections.sort(newList);

Une fois la copie effectuée, les modifications apportées à newList n’affectent pas oldList.

Notez cependant que seules les références sont copiées, de sorte que les deux listes partagent les mêmes objets. Par conséquent, les modifications apportées à éléments d’une liste affectent les éléments de l'autre.

22
Bohemian