2011-03-22 22 views
51
val a: Array[Int] = Array(1,2,4,5) 
val b: Array[Int] = Array(1,2,4,5) 
a==b // false 

¿Hay una forma de coincidencia de patrones para ver si dos matrices (o secuencias) son equivalentes?¿Cómo comparo dos matrices en scala?

+1

duplicado de http://stackoverflow.com/questions/2481149/why-does-array0-1-2-array0-1-2-not-return-the-expected-result y http://stackoverflow.com/questions/3737711/why-doesnt-the-array-equal-function-work-as-expected answer from those is to use 'sameElements' –

+1

Este _es_ un duplicado, pero' sameElements' no funciona bien para las matrices anidadas porque no es recursivo La respuesta de Moritz a continuación es la adecuada ahora (que probablemente debería agregarse a las respuestas anteriores). –

Respuesta

77

necesita cambiar su última línea para

a.deep == b.deep 

hacer una profunda comparación de las matrices.

+15

Esta es la manera canónica de hacerlo. Pero solo una advertencia para los hambrientos de rendimiento: esto _sea_ crear una colección completamente nueva en ambos lados, por lo que no es la forma más eficiente posible de hacerlo. –

+7

@Rex sí, crea una nueva colección, pero esto no significa que sea ineficiente. Mire la implementación del método 'profundo'. Crea una colección que reenvía todas las llamadas del método 'apply' a la matriz original. –

+1

@E. Verda - Hm, la implementación no es lo que esperaba. Pero hace una coincidencia de patrón para cada elemento de la matriz, que es cara si se trata de una matriz de primitivas, y para las matrices anidadas envuelve la matriz en cada acceso. Si las matrices son casi completamente diferentes, es barato; para hacer coincidir matrices cerradas, va a ser costoso en comparación con una solución recursiva no constructiva. –

18
a.corresponds(b){_ == _} 

Scaladoc: true si ambas secuencias tienen la misma longitud y p(x, y) es true para todos los elementos correspondientes x de this array envuelto y y de that, lo contrario false

+4

La matriz no es una secuencia http://www.scala-lang.org/api/current/index.html#scala.Array, por lo que esto requerirá algunos (probablemente redirecciones implícitas). – Basilevs

73

De Programming Scala:

Array(1,2,4,5).sameElements(Array(1,2,4,5)) 
+3

Creo que esta es la solución correcta, aunque la otra es la aceptada. –

+0

Este fue el que ayudó a pasar mi prueba de FreeSpec. :-) –

0

Para un mejor rendimiento que puedes usar:

java.util.Arrays.equals(a, b) 

Esto es muy rápido y no requiere asignación de objetos extra. Array[T] en scala es lo mismo que Object[] en java. La misma historia para valores primitivos como Int que es java int.