arrays - operator - ¿Cómo comparar dos matrices en Kotlin?
kotlin compare strings (4)
Dados algunos arreglos en Kotlin
let a = arrayOf("first", "second")
val b = arrayOf("first", "second")
val c = arrayOf("1st", "2nd")
¿Existen funciones integradas en Kotlin std-lib que comprueban dos matrices para la igualdad (valor) de cada elemento?
Resultando así en:
a.equals(b) // true
a.equals(c) // false
equals()
está devolviendo false
en ambos casos, pero ¿quizás hay funciones integradas en Kotlin que se podrían usar?
Existe la función estática java.utils.Arrays.deepEquals(a.toTypedArray(), b.toTypedArray())
pero preferiría un método de instancia porque funcionaría mejor con los opcionales.
En Kotlin 1.1 puede usar contentEquals
y contentDeepEquals
para comparar dos arreglos para la igualdad estructural . p.ej:
a contentEquals b // true
b contentEquals c // false
En Kotlin 1.0 no hay "funciones incorporadas a Kotlin std-lib que comprueben dos matrices para la igualdad (valor) de cada elemento".
"Las matrices siempre se comparan utilizando equals()
, como todos los demás objetos" ( Solicitud de comentarios: Limitaciones en las clases de datos | Blog de Kotlin ).
Así que a.equals(b)
solo devolverá true
si a
y b
referencia a la misma matriz.
Sin embargo, puede crear sus propios métodos "opcionales" - amigables usando funciones de extensión . p.ej:
fun Array<*>.equalsArray(other: Array<*>) = Arrays.equals(this, other)
fun Array<*>.deepEqualsArray(other: Array<*>) = Arrays.deepEquals(this, other)
PS Los comentarios sobre la solicitud de comentarios: Limitaciones en las clases de datos | También vale la pena leer el blog de Kotlin , específicamente el comentario 39364 .
Kotlin 1.1 introdujo extensiones para comparar arreglos por contenido: contentEquals y contentDeepEquals .
Estas extensiones son infi , por lo que puedes usarlas de la siguiente manera:
val areEqual = arr1 contentEquals arr2
Para un simple igual (no profundo es igual!):
otherArray.size == array.size && otherArray.filter { !array.contains(it) }.isEmpty()
Este código comparará el tamaño y los artículos. Los artículos se comparan con .equals()
.
Y si desea comparar el contenido de dos Collections
ignorando el orden , puede agregar esta extensión simple:
infix fun <T> Collection<T>.sameContentWith(collection: Collection<T>?)
= collection?.let { this.size == it.size && this.containsAll(it) }
... y utilízalo así:
a = mutableListOf<String>()
b = mutableListOf<String>()
isListsHasSameContent = a sameContentWith b