2009-10-14 4 views
31

Je cherchais une méthode qui fonctionne comme Arrays.equals(a1, a2), mais en ignorant l'ordre des éléments. Je n'ai pas pu le trouver dans Google Collections (quelque chose comme Iterables.elementsEqual(), mais cela compte pour la commande) et JUnit (assertEquals() appelle évidemment 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 prends aussi simplement Collection s Une telle méthode prendrait bien sûr en compte tous les éléments dupliqués dans la collection (donc elle ne peut pas simplement tester pour containsAll()).Y at-il un moyen de vérifier si deux collections contiennent les mêmes éléments, indépendamment de l'ordre?

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

Répondre

39

commons-__gVirt_NP_NNS_NNPS<__ collections Apache a CollectionUtils#isEqualCollection:

Renvoie true si les collections contiennent données exactement les mêmes éléments avec exactement la même cardinalité. C'est-à-dire, si la cardinalité de e dans a est égale à la cardinalité de e dans b, pour chaque élément e dans a ou b.

Ce qui est, je pense, exactement ce que vous recherchez.

+21

Si vous ne voulez pas utiliser Apache (ou vous ne pouvez pas) vous pouvez toujours faire: collection1.containsAll (collection2) && collection2.containsAll (collection1) –

+25

@ChrisGonzales, méfiez-vous de cette solution - il retournera vrai pour les deux collections suivantes: collection1 = [1, blah, 1, 4], collection2 = [1, bla, bla, 4]. Où ces deux collections ne sont en effet pas les mêmes. –

2

Si vous voulez ignorer l'ordre, alors que diriez-vous de tester les ensembles pour l'égalité?

new HashSet(c1).equals(new HashSet(c2)) 
+2

Cela ne fonctionne pas, car cela jetterait les éléments en double. En outre, je devrais créer deux nouveaux HashSets. Je préfère éviter de créer de nouveaux objets pour cela. – Jorn

+0

Cela ne pose aucun problème si vous ne vous souciez pas des doublons, par ex. c1 = Arrays.asList (1, 1, 2), c2 = Arrays.asList (1, 2, 2) sera égal à cette expression. – finnw

+2

C'est vrai, mais je me soucie des doublons (comme la question l'indique maintenant) – Jorn

27

C'est trois appels de méthode et utilise Google CollectionsGuava, mais est peut-être aussi simple que cela:

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

Création des Multiset temporaires s peut sembler inutile, mais de comparer les collections efficacement, vous devez les indexer en quelque sorte.

+0

Cela semble être la solution la plus efficace (et simple) que j'ai vu jusqu'ici. – Jorn

+0

@Jorn: Je pensais que vous aviez dit que vous ne demandiez pas comment implémenter ceci ... –

+0

Je ne dis pas que c'est la solution que j'ai demandée, mais je n'ai pas vu une réponse qui me fournit un seul appel de méthode pour fais ceci. – Jorn

Questions connexes