2010-09-01 12 views
19

Suponiendo:¿Hay un método API que compare el contenido de un Seq independientemente del orden?

val l1 = List(1,2,3) 
val l2 = List(2,3,1) 

Quiero un método que confirma que L1 es igual a L2 (como en mismo contenido pero distinto orden). ¿Hay un método API en List/Seq para hacer esto?

l1.sameElements(l2) 

no funciona, ya que también verifica el orden.

se me ha ocurrido con los siguientes:

l1.foldLeft(l1.size == l2.size)(_ && l2.contains(_)) 

¿Hay algo más breve que el de arriba para hacer esta comparación?

+0

http://stackoverflow.com/questions/2944617/use-example-of-scala-observableset-trait –

+0

¿Cómo se relaciona la pregunta vinculada con esta pregunta? – ssanj

+0

Conjuntos podría resolver su problema, pero su comentario a la respuesta a continuación indica que también quiere que los duplicados sean compatibles, por lo que los Conjuntos ahora no funcionarán. –

Respuesta

27

Si lo que quiere es "Estas listas contienen los mismos elementos, independientemente del orden o repeticiones":

l1.toSet == l2.toSet

Si lo que quiere es "Estas listas contienen los mismos elementos, y con la misma número de repeticiones de cada ":

l1.sorted == l2.sorted

Si lo que quiere es" estas listas contienen los mismos elementos y son del mismo tamaño, pero el número de repeticiones de un hecho elemento puede diferir entre las dos listas ":

l1.size == l2.size && l1.toSet == l2.toSet

+0

También quiero atender elementos duplicados. Lista So (1,2,3,3) no debe ser igual (Lista (3,2,1)) – ssanj

+0

Bien, editado para reflejar que :) –

+0

Lista (1,2,3,3) .sorted! = Lista (3,2,1) – ssanj

9

Mientras

l1.sorted == l2.sorted 

es correcto, es el rendimiento de tiempo de ejecución es O (n log n), debido a la clasificación. Para las grandes listas, usted es probablemente mejor con

l1.groupBy(identity) == l2.groupBy(identity) 

que debe ser O (n), suponiendo una aplicación decente de GroupBy.

+0

En Scala, no creo que la solución groupBy funcione, ya que los valores del mapa serán Arrays, y se compararán con igualdad de referencia. 'l1.groupBy (identity) .mapValues ​​(_. length) == ...' funcionaría bien. – csjacobs24

Cuestiones relacionadas