2012-05-04 19 views
27

Estoy implementando una clase Java responsable de ordenar java.util.List. El problema viene cuando uso esta clase. Puedo ordenar la lista pero quiero copiar la lista "original" sin modificaciones para poder registrar cada cambio realizado en la lista original. La lista ordenada contiene un objeto y uno de sus campos almacena una identificación de clasificación, y esta identificación se actualiza con el valor de índice de la lista.Cómo copiar la colección java.util.list

Intenté utilizar el método de clonación y mantiene la lista sin clasificar, pero los cambios realizados en la lista original también se actualizan en la lista de clonación.

¿Hay alguna manera de lograrlo?

Mi Código:

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 

método A 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

Publique su código para que podamos ver lo que está haciendo –

+0

Probablemente relacionado: [Cómo copiar la colección java.util.list?] (Http://stackoverflow.com/questions/10457087/how-to-copy-java -util-list-collection) –

+1

Acabo de editar mi pregunta y agregué un fragmento de código. – user1260893

Respuesta

62

Usted puede crear una nueva lista con una entrada de una lista previa de este modo:

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

Esto le permitirá modificar el orden o lo elemtents están contenidos independiente de la primera lista.

Tenga en cuenta que las dos listas contendrán los mismos objetos, por lo que si modifica un objeto en la Lista dos, el mismo objeto se modificará en la lista uno.

ejemplo:

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

Editar

Para evitar esto es necesario una copia profunda de cada elemento en la lista de este modo:

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

con la copia como la siguiente:

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

    return copy; 
} 
+0

Pero esto es lo que quiero evitar, por ejemplo, si cambio value2 en la Lista dos, no quiero propagar este cambio en List one. – user1260893

+0

Ah, eso cambia las cosas, ¿tienes un método o constructor para copiar un Torero a otro? –

+0

No, no tengo ninguna, ¿podría darme alguna pista? – user1260893

20

utilizar la copia ArrayList constructor, a continuación, ordenar eso.

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

Después de realizar la copia, cualquier cambio en la nueva lista no afecta a la Lista anterior.

Nota sin embargo que sólo las referencias se copian, por lo que las dos listas comparten los mismos objetos, por lo que los cambios realizados en elementos de una lista afecta a los elementos de la otra.

+0

¿Hay alguna forma de que los cambios realizados en los elementos de la lista copiada no se propaguen? – user1260893

+0

Técnicamente no es propagación ya que tiene múltiples referencias al mismo objeto. O bien tiene que hacer copias (lo que reduce la efectividad en el tiempo y el espacio) o usar objetos inmutables (o envoltorios inmutables alrededor de objetos mutables). – Vlasec

Cuestiones relacionadas