web-dev-qa-db-fra.com

Comment comparer deux tableaux dans Kotlin?

É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.

36
Lars Blumberg

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 .

35
mfulton26

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
21
Ilya

Et si vous voulez comparer le contenu de deux Collectionsen 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
18
Alexander Krol

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

3
Kevin Robatel