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?
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?
necesita cambiar su última línea para
a.deep == b.deep
hacer una profunda comparación de las matrices.
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. –
@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. –
@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. –
a.corresponds(b){_ == _}
Scaladoc:
true
si ambas secuencias tienen la misma longitud yp(x, y)
estrue
para todos los elementos correspondientesx
dethis
array envuelto yy
dethat
, lo contrariofalse
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
Array(1,2,4,5).sameElements(Array(1,2,4,5))
Creo que esta es la solución correcta, aunque la otra es la aceptada. –
Este fue el que ayudó a pasar mi prueba de FreeSpec. :-) –
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
.
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' –
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). –