2009-10-14 18 views
31

Ho cercato un metodo che funzioni come Arrays.equals(a1, a2), ma ignorando l'ordine degli elementi. Non sono stato in grado di trovarlo in Google Collections (qualcosa come Iterables.elementsEqual(), ma questo conta per l'ordine) e JUnit (assertEquals() ovviamente chiama solo equals() sulla Collezione, che dipende dall'implementazione della Raccolta, e non è quello che voglio Sarebbe meglio se un tale metodo avrebbe preso Iterable s, ma sto bene anche semplicemente prendendo Collection s Tale metodo dovrebbe ovviamente prendere in considerazione eventuali elementi duplicati nella collezione (quindi non può semplicemente testare per containsAll()).C'è un modo per verificare se due raccolte contengono gli stessi elementi, indipendentemente dall'ordine?

Nota che non sto chiedendo come implementare una cosa del genere, mi stavo solo chiedendo se nessuna delle librerie di collezioni standard ce l'ha.

risposta

39

Apache Commons-collezioni ha CollectionUtils#isEqualCollection:

restituisce true se il dato Collezioni contengono esattamente gli stessi elementi con esattamente la stessa cardinalità.

Cioè, se la cardinalità di e in a è uguale alla cardinalità di e in b, per ogni elemento e in a o b.

Qual è, penso, esattamente quello che stai cercando.

+21

Nel caso in cui non si voglia utilizzare Apache (o non si può) si può sempre fare: collection1.containsAll (collection2) && collection2.containsAll (collection1) –

+25

@ChrisGonzales, attenzione a questa soluzione - restituirà true per le seguenti due raccolte: collection1 = [1, blah, 1, 4], collezione 2 = [1, blah, blah, 4]. Dove queste due raccolte non sono davvero le stesse. –

2

Se si desidera ignorare l'ordine, per quanto riguarda il test di set per l'uguaglianza?

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

Questo non funziona, perché getterebbe via elementi duplicati. Inoltre, dovrei creare due nuovi Hashset. Preferirei evitare di creare nuovi oggetti per questo. – Jorn

+0

Questo va bene se non ti importa dei duplicati, ad es. c1 = Arrays.asList (1, 1, 2), c2 = Arrays.asList (1, 2, 2) sarà uguale secondo questa espressione. – finnw

+2

Vero, ma mi interessa i duplicati (come la domanda ora afferma pure) – Jorn

27

Si tratta di tre chiamate di metodo e utilizza Google CollezioniGuava, ma è forse così semplice come si arriva:

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

Creare le temporanee Multiset s può sembrare uno spreco, ma per confrontare le collezioni in modo efficiente è necessario indicizzarli in qualche modo.

+0

Questa sembra essere la soluzione più efficiente (e semplice) che ho visto finora. – Jorn

+0

@Jorn: pensavo avessi detto che non stavi chiedendo come implementare questo ... –

+0

Non sto dicendo che è la soluzione che ho chiesto, ma non ho visto una risposta che mi fornisca un unico metodo per chiamare Fai questo. – Jorn

Problemi correlati