Tengo dos ArrayList
objetos con tres enteros cada uno. Quiero encontrar una manera de devolver los elementos comunes de las dos listas. ¿Alguien tiene una idea de cómo puedo lograr esto?
95
Utilice Collection#retainAll()
.
listA.retainAll(listB);
// listA now contains only the elements which are also contained in listB.
Si desea evitar que los cambios se vean afectados listA
, debe crear uno nuevo.
List<Integer> common = new ArrayList<Integer>(listA);
common.retainAll(listB);
// common now contains only the elements which are contained in listA and listB.
Collection#retainAll()
y los comentarios en los fragmentos de código, no, no es así. Los cambios se reflejan en la lista a la que está llamando al método.Puede utilizar establecer operaciones de intersección con sus
ArrayList
objetos.Algo como esto:
Ahora,
l3
debería tener solo elementos comunes entrel1
yl2
.fuente
l2
. Probablemente quisiste decir en suList<Integer> l3 = new ArrayList<Integer>(l2);
lugar.¿Por qué reinventar la rueda? Utilice colecciones comunes :
fuente
retainAll()
de los elementos repetidos. Es probable que uno sea correcto y otro incorrecto dependiendo de cómo aborde el problema.Usando el
Stream.filter()
método de Java 8 en combinación conList.contains()
:fuente
fuente
Salida [1, 5]
fuente
Puede obtener los elementos comunes entre dos listas usando el método "retenerAll". Este método eliminará todos los elementos no coincidentes de la lista a la que se aplica.
En este caso de la lista, todos los elementos que no están en list1 serán eliminados y solo quedarán aquellos que son comunes entre list y list1.
Salida:
NOTA: Después de aplicar retenerAll en la lista, la lista contiene un elemento común entre list y list1.
fuente
fuente
fuente
considerar dos listas L1 y L2
Usando Java8 podemos encontrarlo fácilmente
L1.stream().filter(L2::contains).collect(Collectors.toList())
fuente
En caso de que quieras hacerlo tú mismo ...
fuente
commons
contiene los elementos comunes. El segundo bucle for los imprime en la consola. No veo dónde el código está contando los elementos comunes.Algunas de las respuestas anteriores son similares pero no iguales, así que publíquelas como una nueva respuesta.
Solución:
1. Use HashSet para contener los elementos que deben eliminarse
2. Agregue todos los elementos de list1 a HashSet
3. Repita list2 y elimine elementos de un HashSet que están presentes en list2 ==> que están presentes tanto en list1 como en list2
4 . Ahora itere sobre HashSet y elimine elementos de list1 (ya que hemos agregado todos los elementos de list1 al conjunto), finalmente, list1 tiene todos los elementos comunes
Nota: Podemos agregar todos los elementos de list2 y en una tercera iteración, debemos eliminar elementos de lista 2.
Complejidad temporal: O (n)
Complejidad espacial: O (n)
Código:
salida:
fuente