Déterminer si tous les éléments sont identiques dans une liste Java

1. Vue d'ensemble

Dans ce rapide didacticiel, nous découvrirons comment déterminer si tous les éléments d'une liste sont identiques.

Nous examinerons également la complexité temporelle de chaque solution en utilisant la notation Big O, ce qui nous donne le pire des cas.

2. Exemple

Supposons que nous ayons les 3 listes suivantes:

notAllEqualList = Arrays.asList("Jack", "James", "Sam", "James"); emptyList = Arrays.asList(); allEqualList = Arrays.asList("Jack", "Jack", "Jack", "Jack");

Notre tâche est de proposer différentes solutions qui retournent true uniquement pour emptyList et allEqualList .

3. Boucle de base

Premièrement, il est vrai que pour que tous les éléments soient égaux, ils doivent tous être égaux au premier élément. Profitons de cela en boucle:

public boolean verifyAllEqualUsingALoop(List list) { for (String s : list) { if (!s.equals(list.get(0))) return false; } return true; }

C'est bien car, bien que la complexité temporelle soit O (n) , elle peut souvent se terminer tôt.

4. HashSet

Nous pouvons également utiliser un HashSet puisque tous ses éléments sont distincts. Je f nous convertir une liste à un HashSet et la taille résultante est inférieure ou égale à 1, alors nous savons que tous les éléments de la liste sont égaux:

public boolean verifyAllEqualUsingHashSet(List list) { return new HashSet(list).size() <= 1; }

La conversion d'une liste en HashSet coûte O (n) temps alors que la taille d' appel prend O (1) . Ainsi, nous avons toujours une complexité temporelle totale de O (n) .

5. API de collections

Une autre solution consiste à utiliser la méthode de fréquence (Collection c, Object o) de l'API Collections. Cette méthode renvoie le nombre d'éléments dans une Collection c correspondant à un Object o .

Donc, si le résultat de fréquence est égal à la taille de la liste, on sait que tous les éléments sont égaux:

public boolean verifyAllEqualUsingFrequency(List list)  return list.isEmpty() 

Semblable aux solutions précédentes, la complexité temporelle est O (n) car en interne, Collections.frequency () utilise le bouclage de base.

6. Flux

L' API Stream de Java 8 nous offre encore plus de moyens alternatifs de détecter si tous les éléments d'une liste sont égaux.

6.1. distinct()

Examinons une solution particulière utilisant la méthode distinct () .

Pour vérifier si tous les éléments d'une liste sont égaux, nous comptons les éléments distincts de son flux:

public boolean verifyAllEqualUsingStream(List list) { return list.stream() .distinct() .count() <= 1; }

Si le nombre de ce flux est inférieur ou égal à 1, alors tous les éléments sont égaux et nous retournons true .

Le coût total de l'opération est O (n), qui est le temps nécessaire pour parcourir tous les éléments du flux.

6.2. allMatch ()

La méthode allMatch () de l'API Stream fournit une solution parfaite pour déterminer si tous les éléments de ce flux correspondent au prédicat fourni:

public boolean verifyAllEqualAnotherUsingStream(List list)  return list.isEmpty() 

Semblable à l'exemple précédent utilisant des flux, celui-ci a une complexité temporelle O (n) , qui est le temps de parcourir tout le flux.

7. Bibliothèques tierces

Si nous sommes bloqués sur une version antérieure de Java et que nous ne pouvons pas utiliser l'API Stream, nous pouvons utiliser des bibliothèques tierces telles que Google Guava et Apache Commons .

Ici, nous avons deux solutions qui se ressemblent beaucoup, itérer dans une liste d'éléments et la faire correspondre avec le premier élément. Ainsi, nous pouvons facilement calculer la complexité temporelle pour être O (n) .

7.1. Dépendances de Maven

Pour utiliser l'un ou l'autre, nous pouvons ajouter respectivement goyave ou commons-collections4 à notre projet:

 com.google.guava guava 23.0 
     org.apache.commons     commons-collections4     4.1 

7.2. Google Guava

Dans Google Guava , la méthode statique Iterables.all () renvoie true si tous les éléments de la liste satisfont le prédicat:

public boolean verifyAllEqualUsingGuava(List list) { return Iterables.all(list, new Predicate() { public boolean apply(String s) { return s.equals(list.get(0)); } }); }

7.3. Apache Commons

De même, la bibliothèque Apache Commons fournit également une classe utilitaire IterableUtils avec un ensemble de méthodes utilitaires statiques pour fonctionner sur des instances Iterable .

En particulier, la méthode statique IterableUtils.matchesAll () retourne true si tous les éléments de la liste satisfont le prédicat:

public boolean verifyAllEqualUsingApacheCommon(List list) { return IterableUtils.matchesAll(list, new org.apache.commons.collections4.Predicate() { public boolean evaluate(String s) { return s.equals(list.get(0)); } }); } 

8. Conclusion

Dans cet article, nous avons appris différentes façons de vérifier si tous les éléments d'une liste sont égaux en commençant par une simple fonctionnalité Java, puis en montrant des méthodes alternatives en utilisant l' API Stream et les bibliothèques tierces Google Guava et Apache Commons.

Nous avons également appris que chacune des solutions nous donne la même complexité temporelle de O (n) . Cependant, c'est à nous de choisir le meilleur selon comment et où il sera utilisé.

Et assurez-vous de consulter l'ensemble complet d'exemples sur GitHub.