Foros del Web » Programación para mayores de 30 ;) » Java »

Eliminar duplicados ArrayList Objetos

Estas en el tema de Eliminar duplicados ArrayList Objetos en el foro de Java en Foros del Web. Buenas, Cual sería la mejor forma para eliminar duplicados de un ArrayList de objetos.? He probado con contains pero no se pueden comparar con objetos ...
  #1 (permalink)  
Antiguo 22/09/2012, 16:21
 
Fecha de Ingreso: junio-2006
Mensajes: 46
Antigüedad: 18 años, 5 meses
Puntos: 0
Eliminar duplicados ArrayList Objetos

Buenas,

Cual sería la mejor forma para eliminar duplicados de un ArrayList de objetos.?

He probado con contains pero no se pueden comparar con objetos VO... Tampoco me sirve usar un Hash.

Saludos y gracias de antemano.
  #2 (permalink)  
Antiguo 23/09/2012, 22:50
Avatar de zero0097  
Fecha de Ingreso: abril-2010
Ubicación: México
Mensajes: 481
Antigüedad: 14 años, 6 meses
Puntos: 69
Respuesta: Eliminar duplicados ArrayList Objetos

existe la interface Set, que tiene un TreeSet, un Hashset, y no se ke otras hierbas, estas estructuras por default no permiten contenidos duplicados, si agregas mas de 2 veces lo mismo solo lo agrega 1 vez..... sin embargo si vas a agregar objetos propios, como una clase persona o algo así, esa clase debe sobre escribir el método equals y el método hashcode() de modo que tu mismo indiques como diferenciar entre 2 objetos persona por ejemplo...
__________________
De nada, hay te encargo +1...
  #3 (permalink)  
Antiguo 24/09/2012, 01:28
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Eliminar duplicados ArrayList Objetos

Y si no te queda más remedio pues lo implementas tú:

for (Obj obj : arrayList) {
while (indexOf(obj) != lastIndexOf(obj)) {
arrayList.remove(lastIndexOf(obj));
}
} (lo dejo aqui porque se me ha ido la pinza bien bien, como autocrítica)

Bueno me autocritico porque no puedo modificar dinámicamente un arrayList que estoy recorriendo :D

Como te dice zero, la forma más rápida es copiar los objetos a un HashMap o HashSet desde tu ArrayList, así cuando encuentre un duplicado ya no lo introduce. Luego vuelves a pasar los objetos a otro arraylist y ya tienes lo que quieres.

Para la otra opción ... recapitulamos:

List auxArray = arrayList.clone();
// Esto recorre todos los objetos del arrayList pero comparando y eliminando en el auxiliar
for (Obj obj : arrayList) {
while (auxArray.indexOf(obj) != auxArray.lastIndexOf(obj)) {
auxArray.remove(lastIndexOf(obj));
}
}
// Finalmente
arrayList = auxArray();
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}

Última edición por Fuzzylog; 24/09/2012 a las 01:46
  #4 (permalink)  
Antiguo 25/09/2012, 13:34
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: Eliminar duplicados ArrayList Objetos

Buenas,

Para poder usar el método contains correctamente tienes que sobrescribir el método equals y getHashCode con las particularidades de la clase.

Una vez sobrescritos los métodos, puedes hacerlo a mano o usando algunas de las estructuras de java:


Código Java:
Ver original
  1. ArrayList<ClaseObjeto> lista = new  ArrayList<ClaseObjeto>();
  2.  
  3. //Aquí lo llenas de objetos
  4. //..............
  5.  
  6. //Al utilizar un HashSet se eliminan todos los duplicados y luego lo conviertes de nuevo a una lista
  7. lista = new ArrayList<ClaseObjeto>(new HashSet<ClaseObjeto>(lista));

Obviamente, si la lista es muy grande probablemente este no sea el mejor método y tengas que implementar tu propia forma, pero para poder usar el método contains tienes que hacer lo que te he dicho.

Un saludo.
  #5 (permalink)  
Antiguo 26/09/2012, 05:49
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Eliminar duplicados ArrayList Objetos

Argh pensé que el contains se referia a otro post parecido.

Bueno, tiene mucha razón.

El unico caso para el que no se sobreescribe es para ArrayLists de objetos que sean wrappers de tipos primitivos (Ejemplo String, Integer, Short...).
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}

Etiquetas: arraylist, duplicados, objetos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:26.