2009-10-14 23 views
31

He estado buscando un método que opere como Arrays.equals(a1, a2), pero ignorando el orden de los elementos. No he podido encontrarlo en Google Collections (algo así como Iterables.elementsEqual(), pero eso explica el pedido) y JUnit (assertEquals() obviamente solo llama al equals() en la Colección, que depende de la implementación de la Colección, y eso no es lo que quiero) Sería mejor si tal método tomara Iterable s, pero también estoy bien con simplemente tomar Collection s Tal método tomaría en cuenta cualquier elemento duplicado en la colección (por lo que no puede simplemente probar para containsAll()).¿Hay alguna manera de verificar si dos colecciones contienen los mismos elementos, independientemente de la orden?

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.

Respuesta

39

Apache Commons-colecciones tiene CollectionUtils#isEqualCollection:

devuelve verdadero si las Colecciones dados 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 aob.

Que es, creo, exactamente lo que buscas.

+21

En caso de que no desee utilizar Apache (o no puede) siempre puede hacerlo: collection1.containsAll (collection2) && collection2.containsAll (collection1) –

+25

@ChrisGonzales, tenga cuidado con esa solución - se devolverá cierto para las siguientes dos colecciones: colección1 = [1, bla, 1, 4], colección2 = [1, bla, bla, 4]. Donde esas dos colecciones de hecho no son lo mismo. –

2

Si quiere ignorar el orden, ¿qué hay de los conjuntos de prueba para la igualdad?

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

Eso no funciona, porque arrojaría elementos duplicados. Además, tendría que crear dos nuevos HashSets. Prefiero evitar crear nuevos objetos para esto. – Jorn

+0

Esto está bien si no te importan los duplicados, p. c1 = Arrays.asList (1, 1, 2), c2 = Arrays.asList (1, 2, 2) serán iguales de acuerdo con esta expresión. – finnw

+2

Cierto, pero me importan los duplicados (como ahora también lo dice la pregunta) – Jorn

27

Esto es tres llamadas a métodos y usos Google ColeccionesGuava, pero es posiblemente tan simple como se pone:

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

Creación de los temporales Multiset s puede parecer un desperdicio, sino para comparar las colecciones de manera eficiente necesita indexarlos de alguna manera.

+0

Esta parece ser la solución más eficiente (y simple) que he visto hasta ahora. – Jorn

+0

@Jorn: Pensé que había dicho que no estaba preguntando cómo implementar esto ... –

+0

No estoy diciendo que sea la solución que pedí, pero no he visto una respuesta que me proporcione una llamada a un solo método para hacer esto. – Jorn

Cuestiones relacionadas