Il y a probablement un simple une ligne que je ne trouve pas ici, mais voici ma question:
Comment vérifier si une ArrayList contient tous les objets d'une autre ArrayList? Je cherche (s'il existe) quelque chose dans le genre de:
//INCORRECT EXAMPLE:
if(one.contains(two))
{
return true;
}
else
{
return false;
}
Par exemple:
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
Il existe une méthode appelée containsAll
déclarée dans l'interface Java.util.Collection
. Dans votre réglage, one.containsAll(two)
donne la réponse souhaitée.
Par l'interface de la liste:
myList.containsAll(...);
Jetez un coup d'œil à la méthode containsAll(Collection<?> c)
de l'interface List
. Je pense que c'est ce que vous recherchez.
Vous pouvez utiliser la méthode containsAll
de la liste pour effectuer la vérification. Cependant, il s'agit d'une opération linéaire. Si la liste est longue, convertissez-la d'abord en HashSet
, puis effectuez containsAll
:
HashSet tmp = new HashSet(one);
if (tmp.containsAll(two)) {
...
}
Si la longueur de one
est N
et la longueur de deux est M
, cette solution a une complexité temporelle de O(M+N)
; le "simple" containsAll
a la complexité de O(M*N)
, ce qui peut être bien pire.
Voici un autre exemple d'utilisation de includesAll () que j'ai utilisé pour affirmer que deux tableaux sont égaux dans les tests 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));
Votre code dans l'exemple n'a pas de sens, mais voici un exemple quand même.
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;
}
}
Il parcourt simplement tous les éléments de two
et vérifie s'ils sont dans one
.
Ensuite, le booléen good
contient la valeur souhaitée.
Voir ArrayList # contient .
[~ # ~] éditer [~ # ~] : oh wow, j'ai totalement oublié includesAll . Eh bien, c’est une autre façon de le faire si vous voulez vraiment le comprendre.