Compruebe si un ArrayList contiene todos los elementos de otro ArrayList

2 minutos de lectura

Avatar de usuario de Evorlor
Evorlor

Probablemente haya una sola línea que simplemente no encuentro aquí, pero esta es mi pregunta:

¿Cómo verifico si un ArrayList contiene todos los objetos en otro ArrayList? Estoy buscando (si existe) algo como:

//INCORRECT EXAMPLE:
if(one.contains(two))
{
    return true;
}
else
{
    return false;
}

Por ejemplo:

ArrayList one = {1, 2, 3, 4, 5}

ArrayList two = {1, 2, 3} --> True
ArrayList two = {} --> True
ArrayList two = {1, 2, 3, 4, 5} --> True
ArrayList two = {1, 5, 2} --> True
ArrayList two = {1, 7, 4} --> False
ArrayList two = {0, 1, 3} --> False
ArrayList two = {4, 5, 6} --> False
ArrayList two = {7, 8, 9} --> False

  • en ese caso quieres que contengaTodos (ya una respuesta)

    – capuchas

    24 de enero de 2013 a las 22:08


  • Y puede reducir su instrucción if a una sola línea: return one.containsAll(two);

    – Aprendiz de código

    25 de enero de 2013 a las 0:40

  • Relacionado: meta.stackoverflow.com/q/382499/1889720

    – Evorlor

    8 de abril de 2019 a las 12:55

Avatar de usuario de C-Otto
C-Otto

Hay un método llamado containsAll declarado en el java.util.Collection interfaz. en tu entorno one.containsAll(two) da la respuesta deseada.

Según la interfaz de lista:

myList.containsAll(...);

Echa un vistazo a containsAll(Collection<?> c) método de List interfaz. Creo que es lo que buscas.

Aquí hay otro ejemplo de uso de containsAll() que he usado para afirmar que dos matrices son iguales en las pruebas JUnit:

List<String> expected = new ArrayList<String>();
expected.add("this");
expected.add("that");
expected.add("another");

List<String> actual = new ArrayListString();
actual.add("another");
actual.add("that");
actual.add("this");

Assert.assertTrue("The lists do not match!", expected.containsAll(actual));

Puedes usar containsAll método de la lista para hacer la comprobación. Sin embargo, esta es una operación lineal. Si la lista es grande, debe convertirla a HashSet primero, y luego realizar containsAll:

HashSet tmp = new HashSet(one);
if (tmp.containsAll(two)) {
    ...
}

Si la longitud de one es N y la longitud de dos es Mesta solución tiene una complejidad temporal de O(M+N); el avion” containsAll tiene la complejidad de O(M*N)que puede ser significativamente peor.

avatar de usuario de tckmn
tckmn

Su código en el ejemplo no tiene sentido, pero aquí hay un ejemplo de todos modos.

ArrayList<Integer> one, two;
//initialize
boolean good = true;
for (int i = 0; i < two.size(); i ++) {
    if (!(one.contains(two.get(i))) {
        good = false;
        break;
    }
}

Simplemente recorre todo two‘s elementos y controles para ver si están en one.

Entonces el booleano good contiene el valor que desea.

Ver ArrayList# contiene.

EDITAR: oh wow, lo olvidé por completo contieneTodo. Bueno, esta es una forma alternativa de hacerlo si realmente quieres entenderlo.

Avatar de usuario de Piyush Aggarwal
Piyush Aggarwal

Esto también se puede hacer usando flujos en Java

    List<String> employeeList = Arrays.asList("Marc","john");
    List<String> masterEmployeeList = Arrays.asList("Marc", "Stacy", "john");
    System.out.println(employeeList.stream().allMatch(masterEmployeeList::contains));

¿Ha sido útil esta solución?