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

Borrar duplicados de un ArrayList

Estas en el tema de Borrar duplicados de un ArrayList en el foro de Java en Foros del Web. Hola a todos. Veréis, me encuentro con el siguiente problema. Tengo un ArrayList (de java.util) con objetos, algunos de ellos duplicados y no sé cómo ...
  #1 (permalink)  
Antiguo 15/12/2008, 15:12
 
Fecha de Ingreso: agosto-2006
Mensajes: 35
Antigüedad: 17 años, 8 meses
Puntos: 0
Borrar duplicados de un ArrayList

Hola a todos.
Veréis, me encuentro con el siguiente problema. Tengo un ArrayList (de java.util) con objetos, algunos de ellos duplicados y no sé cómo hacer para generar otro ArrayList que tenga sólo los objetos que no estén duplicados.

He probado a recorrer la lista de la siguiente manera:

Código:
for(int i=0; i<arrayList.size(); i++) {
    Contrato contrato = (Contrato) arrayList.get(i);
    for(int j=i+1; j<arrayList.size(); j++ {
        Contrato contrato2 = (Contrato) arrayList.get(j);
        if (contrato.getNumContrato.equals(contrato2.getNumContrato) {
            arrayList.remove(j);
        }
    }
}
Es decir, coger el primer elemento y compararlo con el resto a través del número de contrato. Si coinciden, lo borra y si no, pasa al siguiente.
Pero me parece que me estoy dejando algo porque no me borra todos. ¿Alguien me puede decir cuál es la solución óptima (si encima es usando iteradores, mejor)?
Otra duda que tengo es que al ir borrando se va cambiando el tamaño del ArrayList...

Gracias de antemano.
  #2 (permalink)  
Antiguo 15/12/2008, 15:21
 
Fecha de Ingreso: diciembre-2008
Mensajes: 3
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Borrar duplicados de un ArrayList

Si lo que queres es que no existan duplicados en una collection lo que tenes que usar es un set en alguna de sus implementaciones, como hashset (no recuerdo otras) si no podes usar directamente un set (aunque no se me ocurre porque) creo que los set tienen un constructor que resibe como parametro un list, entonces generas un set sin duplicados y luego los list tienen un constructor que reciben un set como parametro, y te queda el list sin duplicados.

otra cosa a tener en cuenta es que cuando declares HashSet<MiObjeto> MiObjeto debe sobreescribir equals y hashcode para determinar cuando 2 objetos son iguales
  #3 (permalink)  
Antiguo 15/12/2008, 15:39
 
Fecha de Ingreso: agosto-2006
Mensajes: 35
Antigüedad: 17 años, 8 meses
Puntos: 0
Respuesta: Borrar duplicados de un ArrayList

Entonces, haciendo:

Código:
HashSet hashset = new HashSet();
hashset.addAll(arrayList);
¿Con eso es suficiente?
Lo que pasa es que el equals que tengo overriden (sobreescrito) compara por un campo (idContrato) y yo quiero comparar por el Nº de contrato (otro campo diferente).
  #4 (permalink)  
Antiguo 15/12/2008, 17:03
 
Fecha de Ingreso: diciembre-2008
Mensajes: 3
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Borrar duplicados de un ArrayList

esta es solo una teoria...

si el bean implementa la interfaz Comparable es posible saber cuando un objeto es menor, igual o mayor a otro y lo definis para numeroContrato.

Pones el ArrayList en un SortedSet (no recuerdo si es una implementacion o una interfaz) entonces te queda ordenado.

y con un solo recorrido podes eliminar todos los duplicados

guardas el numeroContrato actual
mientras se repita en el siguiente haces un remove
cuando no se repita... guardas el numeroContrato

creo que los set tienen un metodo hasNext() que permite saber si existe un siguiete asique eso iria en un while:

while(MiSortedSet.hasNext()) {
//el recorrido anterior
}
  #5 (permalink)  
Antiguo 16/12/2008, 01:32
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Borrar duplicados de un ArrayList

Si el equals no te devuelve el valor correcto para definir si dos objetos son "iguales", no hay ningun mecanismo automatico en Java que te pueda ayudar a quitar los "repetidos" puesto que la forma de decirle a Java sin son repetidos es a través de equals.

La forma de hacerlo a mano sería meterlos todos en un Map usando como clave el Nº de contrato, cuando acabes, en el Map solo tendras un objeto por cada clave, asi que no tendras objetos con el mismo numero de contrato.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #6 (permalink)  
Antiguo 16/12/2008, 04:54
 
Fecha de Ingreso: agosto-2006
Mensajes: 35
Antigüedad: 17 años, 8 meses
Puntos: 0
Respuesta: Borrar duplicados de un ArrayList

Cita:
Iniciado por alquimistaar Ver Mensaje
esta es solo una teoria...

si el bean implementa la interfaz Comparable es posible saber cuando un objeto es menor, igual o mayor a otro y lo definis para numeroContrato.

Pones el ArrayList en un SortedSet (no recuerdo si es una implementacion o una interfaz) entonces te queda ordenado.

y con un solo recorrido podes eliminar todos los duplicados

guardas el numeroContrato actual
mientras se repita en el siguiente haces un remove
cuando no se repita... guardas el numeroContrato

creo que los set tienen un metodo hasNext() que permite saber si existe un siguiete asique eso iria en un while:

while(MiSortedSet.hasNext()) {
//el recorrido anterior
}
He probado lo siguiente:

Código:
TreeSet contratosUnicos = new TreeSet(contratos);
Pero de esta forma sólo me guarda el primero del ArrayList contratos porque el 2º elemento al estar repetido deja de mirar (supongo que es por eso, porque no se me ocurre otra cosa). Así que tampoco me sirve...
  #7 (permalink)  
Antiguo 16/12/2008, 05:08
 
Fecha de Ingreso: septiembre-2003
Mensajes: 122
Antigüedad: 20 años, 7 meses
Puntos: 0
Respuesta: Borrar duplicados de un ArrayList

porque no haces algo...
Código:
Iterator iterador = miCollection.iterator();
ArrayList sortedList = new ArrayList();
Object obj;
while(iterador.hasNext()){
    obj = iterador.next();
    if(!sortedList.contains(obj)){
         sortedList.add(obj);
    }
}
Igualmente estoy casi seguro que debe existir alguna implementacion de Collection que haga esto.
  #8 (permalink)  
Antiguo 16/12/2008, 05:16
 
Fecha de Ingreso: agosto-2006
Mensajes: 35
Antigüedad: 17 años, 8 meses
Puntos: 0
Respuesta: Borrar duplicados de un ArrayList

Lo he solucionado cambiando el atributo en el compareTo() que tenía sobreescrito en el bean. Comparando por el número de contrato y con la línea anterior me he generado un TreeSet sin elementos repetidos y ordenado.
Código:
public int compareTo(Object o) {
        ContratoBean bean = (ContratoBean) o;
        String pk1 = this.numcontrato;
        String pk2 = bean.numcontrato;
        return pk1.compareTo(pk2);
    }
Gracias a todos por vuestras respuestas :)
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 12:14.