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 Iterable
s, mais je suis également d'accord avec la simple prise de Collection
s 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.
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.
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.
Si vous voulez ignorer l'ordre, pourquoi ne pas tester les ensembles pour l'égalité?
new HashSet(c1).equals(new HashSet(c2))