Étant donné quelques 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 librairie std-lib de Kotlin qui testent deux tableaux pour l'égalité (de valeur) pour chaque élément?
Il en résulte ainsi:
a.equals(b) // true
a.equals(c) // false
equals()
retourne en fait false
dans les deux cas, mais peut-être y a-t-il 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 plutôt une méthode d'instance car elle fonctionnerait mieux avec les options.
Dans Kotlin 1.1, vous pouvez utiliser contentEquals
et contentDeepEquals
pour comparer deux tableaux pour structurel é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 au Kotlin std-lib qui teste deux tableaux pour (valeur) l'égalité pour chaque élément."
"Les tableaux sont toujours comparés à l'aide de equals()
, comme tous les autres objets" ( Demande de commentaires: limitations sur les classes de données | Blog Kotlin ).
Ainsi, a.equals(b)
renverra uniquement true
si a
et b
font référence au même tableau.
Vous pouvez cependant créer vos propres méthodes "optionnelles" 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 sur Demande de rétroaction: limitations des classes de données | Blog Kotlin valent également la peine d'être lus, en particulier commentaire 39364 .
Kotlin 1.1 a introduit des extensions pour comparer les tableaux par contenu: contentEquals et contentDeepEquals .
Ces extensions sont infixées , vous pouvez donc les utiliser de la manière suivante:
val areEqual = arr1 contentEquals arr2
Et si vous voulez comparer le contenu de deux Collections
en ignorant l'ordre 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 utilisez-le comme ceci:
a = mutableListOf<String>()
b = mutableListOf<String>()
isListsHasSameContent = a sameContentWith b
Pour un simple égal (pas égal profond!):
otherArray.size == array.size && otherArray.filter { !array.contains(it) }.isEmpty()
Ce code comparera la taille et les articles. Les éléments sont comparés à .equals()
.