2011-05-23 25 views
9

Quiero agregar los elementos de una lista a otra lista sin ningún duplicado. He utilizado el siguiente método que implica un conjunto. ¿Es esta la forma más eficiente de lograr el resultado final? ¿Hay alguna manera más clara de actualizar lista para contener los objetos únicos de setboth?Combinar dos listas sin duplicados

Set setboth = new HashSet(lista); 
setboth.addAll(listb); 
lista.clear(); 
lista.addAll(setboth); 
+3

Así es como yo lo haría. – jjnguy

+2

Parece que quieres un 'Set' no una' List'. –

Respuesta

9

Se ve bien, pero depende de si los elementos implementan equals y hashCode.

La estructura de datos HashSet se basa en implementaciones válidas de equals y hashCode. Las clases que tienen una implementación toString() que muestra la misma cadena para dos instancias no se considerarán como la misma instancia a menos que ambas instancias también devuelvan el mismo código hash y devuelvan verdadero en iguales.

+0

Incluso si no lo hacen, los métodos predeterminados 'equals()' y 'hashCode()' que funcionan en función de la identidad del objeto, deberían estar bien. –

+2

No si ha creado clases donde dos instancias diferentes se deben considerar como la misma instancia (por ejemplo, una clase Person donde dos instancias con el mismo número de seguridad social se deben considerar como una sola persona) – Kaj

+0

Sí, pero luego debe haber anulado los 'iguales () 'método. El método 'equals()' * define * cuando dos objetos deben considerarse iguales. –

2

Si el resultado final solo puede ser cualquier Collection, sólo puede utilizar setBoth directamente, sin necesidad de copiar todos los resultados en lista.

9

O usted puede hacer esto:

list1.removeAll(list2); 
list2.addAll(list1); 

Pero es probable que sea más lento que usar un HashSet, dependiendo de la clase de implementación de lista. Asimismo, se cambia una de las listas originales (que puede o no puede ser una opción en su contexto)

1

// CollectionUtils.intersection (ownerList, bcList) devuelve una colección contiene tanto ownerList, bcList

CollectionUtils .union unions la lista de bc en una lista única

private List getAuthorisedBCList (List bcList, Set> bcOwnersList) { Lista listList = new ArrayList();

for(List<String> ownerList : bcOwnersList){ 
     listList = (List<String>) CollectionUtils.union(listList,CollectionUtils.intersection(ownerList, bcList)); 
    } 
    return listList; 
} 
1

Sé que esta pregunta ha sido contestada, pero creo que hay otra forma de hacerlo y puede ser útil para alguien de aterrizar en esta página.

lista.add(listb); 
listb.clear(); 
listb.add(new ArrayList<String>(new LinkedHashSet<String>(lista)));