web-dev-qa-db-fra.com

Existe-t-il un moyen de vérifier si deux collections contiennent les mêmes éléments, indépendamment de l'ordre?

Je cherchais une méthode qui fonctionne comme Arrays.equals(a1, a2), mais en ignorant l'ordre des éléments. Je n'ai pas été en mesure de le trouver dans Google Collections (quelque chose comme Iterables.elementsEqual(), mais cela tient compte de la commande) et JUnit (assertEquals() évidemment appelle simplement equals() sur la collection, qui dépend de l'implémentation de la collection, et ce n'est pas ce que je veux) Il serait préférable qu'une telle méthode prenne Iterables, mais je suis également d'accord avec la simple prise de Collections Une telle méthode prendrait bien sûr en compte tous les éléments en double dans la collection (elle ne peut donc pas simplement tester containsAll()).

Notez que je ne demande pas comment implémenter une telle chose, je me demandais simplement si l'une des bibliothèques de collections standard l'avait.

37
Jorn

Apache commons-collections a CollectionUtils # isEqualCollection :

Renvoie true si les collections données contiennent exactement les mêmes éléments avec exactement la même cardinalité.

Autrement dit, si la cardinalité de e dans a est égale à la cardinalité de e dans b, pour chaque élément e dans a ou b.

Je pense que c'est exactement ce que vous recherchez.

46
Cowan

Il s'agit de trois appels de méthode et utilise Collections GoogleGuava , mais est peut-être aussi simple que possible:

HashMultiset.create(c1).equals(HashMultiset.create(c2));

La création de Multiset temporaires peut sembler inutile, mais pour comparer les collections efficacement, vous devez les indexer d'une manière ou d'une autre.

29
finnw

Si vous voulez ignorer l'ordre, pourquoi ne pas tester les ensembles pour l'égalité?

new HashSet(c1).equals(new HashSet(c2))
3
newacct