web-dev-qa-db-fra.com

Vérifier si une ArrayList contient tous les éléments d'une autre ArrayList (ou Collection)

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
44
Evorlor

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.

78
C-Otto

Par l'interface de la liste:

myList.containsAll(...);
11
splungebob

Jetez un coup d'œil à la méthode containsAll(Collection<?> c) de l'interface List. Je pense que c'est ce que vous recherchez.

10
Damian Jeżewski

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.

5
dasblinkenlight

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));
5
JimiMac

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.

3
Doorknob