studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java list find element

java - programacion - Compruebe si una lista contiene elementos de la otra



manual de programacion android pdf (9)

Tengo dos listas con diferentes objetos en ellos.

List<Object1> list1; List<Object2> list2;

Quiero verificar si el elemento de list1 existe en list2, en función de un atributo específico (Object1 y Object2 tienen (entre otros), un atributo mutuo (con tipo Long), llamado attributeSame).

ahora mismo, lo hago así:

boolean found = false; for(Object1 object1 : list1){ for(Object2 object2: list2){ if(object1.getAttributeSame() == object2.getAttributeSame()){ found = true; //also do something } } if(!found){ //do something } found = false; }

Pero creo que hay una manera mejor y más rápida de hacerlo :) ¿Puede alguien proponerlo?

¡Gracias!


¿Puedes definir el tipo de datos que guardas? ¿es un gran dato? ¿está ordenado? Creo que debes considerar diferentes enfoques de eficiencia dependiendo de los datos.

Por ejemplo, si sus datos son grandes y no están clasificados, intente iterar juntos las dos listas por índice y almacene cada atributo de lista en otra lista auxiliar. entonces podría cruzar la verificación por los atributos actuales en las listas de ayuda.

buena suerte

editado: y yo no recomendaría sobrecargar iguales. es peligroso y probablemente en contra de su objeto oop significado.


De acuerdo con JavaDoc para .contains(Object obj) :

Devuelve verdadero si esta lista contiene el elemento especificado. Más formalmente, devuelve verdadero si y solo si esta lista contiene al menos un elemento e tal que (o == null? E == null: o.equals (e)).

Entonces, si anula su método .equals() para su objeto dado, debería poder hacer: if(list1.contains(object2))...

Si los elementos serán únicos (es decir, tienen diferentes atributos), usted puede anular los .equals() y .hashcode() y almacenar todo en HashSets . Esto le permitirá verificar si uno contiene otro elemento en tiempo constante.


Esto se puede hacer con el JDK básico sin modificar las listas de entrada en una línea

!Collections.disjoint(list1, list2);


Hay un método de Collection llamado retainAll pero que tiene algunos efectos secundarios para su reference

Retiene solo los elementos en esta lista que están contenidos en la colección especificada (operación opcional). En otras palabras, elimina de esta lista todos sus elementos que no están contenidos en la colección especificada.

verdadero si esta lista cambió como resultado de la llamada

Es como

boolean b = list1.retainAll(list2);


La respuesta de Loius es correcta, solo quiero agregar un ejemplo:

listOne.add("A"); listOne.add("B"); listOne.add("C"); listTwo.add("D"); listTwo.add("E"); listTwo.add("F"); boolean noElementsInCommon = Collections.disjoint(listOne, listTwo); // true


Puede utilizar Apache Commons CollectionUtils :

if(CollectionUtils.containsAny(list1,list2)) { // do whatever you want } else { // do other thing }

Esto supone que ha sobrecargado correctamente la funcionalidad de igual para sus objetos personalizados.


para hacerlo más rápido, puede agregar un descanso; de esa forma el ciclo se detendrá si se encuentra establecido en verdadero:

boolean found = false; for(Object1 object1 : list1){ for(Object2 object2: list2){ if(object1.getAttributeSame() == object2.getAttributeSame()){ found = true; //also do something break; } } if(!found){ //do something } found = false; }

Si tuviera mapas en lugar de listas con el mismo atributo attributeSame, podría verificar más rápidamente un valor en un mapa si hay un valor correspondiente en el segundo mapa o no.


una forma más rápida requerirá espacio adicional.

Por ejemplo:

  1. ponga todos los elementos en una lista en un HashSet (usted tiene que implementar la función hash usted mismo para usar object.getAttributeSame ())

  2. Pase por la otra lista y verifique si hay algún elemento en el HashSet.

De esta forma, cada objeto se visita como máximo una vez. y HashSet es lo suficientemente rápido como para verificar o insertar cualquier objeto en O (1).


org.springframework.util.CollectionUtils

boolean containsAny(java.util.Collection<?> source, java.util.Collection<?> candidates) Return true if any element in ''candidates'' is contained in ''source''; otherwise returns false