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.
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.
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
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
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()
.