180 votes

Vérifier si une liste contient un élément de l'autre

J'ai deux listes contenant des objets différents.

List<Object1> list1;
List<Object2> list2;

Je veux vérifier si un élément de la liste 1 existe dans la liste 2, sur la base d'un attribut spécifique (Object1 et Object2 ont (entre autres), un attribut mutuel (de type Long), nommé attributeSame).

Pour l'instant, je fais comme ça :

boolean found = false;
for(Object1 object1 : list1){
   for(Object2 object2: list2){
       if(object1.getAttributeSame() == object2.getAttributeSame()){
           found = true;
           //also do something
       }
    }
    if(!found){
        //do something
    }
    found = false;
}

Mais je pense qu'il y a un moyen meilleur et plus rapide de le faire :) Quelqu'un peut-il la proposer ?

Gracias.

313voto

Louis Wasserman Points 67557

Si vous avez juste besoin de tester l'égalité de base, cela peut être fait avec le JDK de base sans modifier les listes d'entrée en une seule ligne

!Collections.disjoint(list1, list2);

Si vous devez tester une propriété spécifique, c'est plus difficile. Je recommanderais, par défaut,

list1.stream()
   .map(Object1::getProperty)
   .anyMatch(
     list2.stream()
       .map(Object2::getProperty)
       .collect(toSet())
       ::contains)

...qui rassemble les valeurs distinctes dans list2 et teste chaque valeur dans list1 pour la présence.

106voto

ketanjain Points 631

Pour raccourcir la logique de Narendra, vous pouvez utiliser ceci :

boolean var = lis1.stream().anyMatch(element -> list2.contains(element));

60voto

Woot4Moo Points 14245

Vous pouvez utiliser Apache Commons CollectionUtils :

if(CollectionUtils.containsAny(list1,list2)) {  
    // do whatever you want
} else { 
    // do other thing 
}  

Cela suppose que vous avez correctement surchargé la fonctionnalité equals pour vos objets personnalisés.

10voto

Matias Elorriaga Points 184

La réponse de Loius est correcte, je veux juste ajouter un exemple :

listOne.add("A");
listOne.add("B");
listOne.add("C");

listTwo.add("D");
listTwo.add("E");
listTwo.add("F");      

boolean noElementsInCommon = Collections.disjoint(listOne, listTwo); // true

10voto

Harmeet Singh Points 1760

Il y a une méthode de Collection nommé retainAll mais avoir un peu effets secondaires pour vous référence

Ne conserve que les éléments de cette liste qui sont contenus dans l'élément collection spécifiée (opération facultative). En d'autres termes, supprime de cette liste tous ses éléments qui ne sont pas contenus dans la collection spécifiée.

vrai si cette liste a été modifiée à la suite de l'appel

C'est comme si

boolean b = list1.retainAll(list2);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X