strings operator objects example array arrays equals kotlin

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