Comment comparer deux tableaux à Kotlin?

compte tenu de certains des tableaux dans Kotlin

let a = arrayOf("first", "second")
val b = arrayOf("first", "second")
val c = arrayOf("1st", "2nd")

Existe-t-il des fonctions intégrées à la norme Kotlin std-lib qui teste deux tableaux pour l'égalité (valeur) pour chaque élément?

Donc:

a.equals(b) // true
a.equals(c) // false

equals() est en fait de retour false dans les deux cas, mais peut-être Qu'il y a des fonctions intégrées à Kotlin que l'on pourrait utiliser?

Il y a la fonction statique java.utils.Arrays.deepEquals(a.toTypedArray(), b.toTypedArray()) mais je préférerais une méthode d'instance qu'il serait mieux travailler avec facultatif.

23
demandé sur Lars Blumberg 2016-02-08 18:05:01

4 réponses

Dans Kotlin 1.1 vous pouvez utiliser contentEquals et contentDeepEquals pour comparer deux tableaux pour structurels l'égalité. par exemple:

a contentEquals b // true
b contentEquals c // false

dans Kotlin 1.0 il n'y a pas de "fonctions intégrées à la norme Kotlin std-lib qui teste deux tableaux pour l'égalité (valeur) pour chaque élément."

" les tableaux sont toujours comparés en utilisant equals(), comme tous les autres objets" (demande de rétroaction: limites sur les Classes de données / Kotlin Blog).

a.equals(b) ne retour true si a et b de référence de la même matrice.

vous pouvez, cependant, créer vos propres méthodes"optionals" conviviales en utilisant fonctions d'extension. par exemple:

fun Array<*>.equalsArray(other: Array<*>) = Arrays.equals(this, other)
fun Array<*>.deepEqualsArray(other: Array<*>) = Arrays.deepEquals(this, other)

P. S. Les commentaires Demande de Rétroaction: les Limitations sur les Classes de Données | Kotlin Blog valent également la peine d'être lus, en particulier 39364.

21
répondu mfulton26 2017-05-01 13:25:00

Kotlin 1.1 introduit des extensions pour comparer des tableaux par contenu: contentEquals et contentDeepEquals.

Ces extensions sont infix, de sorte que vous pouvez les utiliser de la façon suivante:

val areEqual = arr1 contentEquals arr2
19
répondu Ilya 2017-04-19 19:06:55

Et si vous voulez comparer le contenu de deux Collections tenir compte de l'ordonnance vous pouvez ajouter cette extension simple:

infix fun <T> Collection<T>.sameContentWith(collection: Collection<T>?)
    = collection?.let { this.size == it.size && this.containsAll(it) }

...et de l'utiliser comme ceci:

a = mutableListOf<String>()
b = mutableListOf<String>()

isListsHasSameContent = a sameContentWith b
4
répondu Alexander Krol 2018-02-13 15:15:12

pour des égaux simples (pas des égaux profonds!):

otherArray.size == array.size && otherArray.filter { !array.contains(it) }.isEmpty()

ce code compare la taille et les éléments. Les éléments sont comparés avec .equals().

2
répondu Kevin Robatel 2016-08-04 13:17:35