¿Hay alguna forma de comprobar si dos colecciones contienen los mismos elementos, independientemente del orden?

Resuelto Jorn asked hace 15 años • 3 respuestas

He estado buscando un método que funcione como Arrays.equals(a1, a2), pero ignorando el orden de los elementos. No he podido encontrarlo ni en las Colecciones de Google (algo así como Iterables.elementsEqual(), pero eso sí cuenta para realizar pedidos) ni en JUnit ( assertEquals()obviamente solo llama equals()a la Colección, que depende de la implementación de la Colección, y eso no es lo que quiero). Sería mejor si dicho método tomara Iterables, pero también estoy de acuerdo con simplemente tomar Collections. Dicho método, por supuesto, tendría en cuenta cualquier elemento duplicado en la colección (por lo que no puede simplemente probar containsAll()).

Tenga en cuenta que no estoy preguntando cómo implementar tal cosa, solo me preguntaba si alguna de las bibliotecas de Colecciones estándar lo tiene.

Jorn avatar Oct 14 '09 16:10 Jorn
Aceptado

Apache commons-collections tiene CollectionUtils#isEqualCollection :

Devuelve verdadero si las Colecciones dadas contienen exactamente los mismos elementos con exactamente la misma cardinalidad.

Es decir, si la cardinalidad de e en a es igual a la cardinalidad de e en b, para cada elemento e en a o b.

Que es, creo, exactamente lo que buscas.

Cowan avatar Oct 16 '2009 09:10 Cowan

Se trata de tres llamadas a métodos y utiliza Google Collections Guava , pero posiblemente sea tan simple como parece:

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

Crear los Multisetcorreos electrónicos temporales puede parecer un desperdicio, pero para comparar las colecciones de manera eficiente es necesario indexarlas de alguna manera.

finnw avatar Oct 14 '2009 09:10 finnw