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
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 M
esta 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.
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.
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));
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