Hoe vergelijk je twee arrays in Kotlin?

Gezien enkele arrays in Kotlin

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

Zijn er ingebouwde functies in de Kotlin std-lib die twee arrays test op (waarde)gelijkheid voor elk element?

Dus resulterend in:

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

equals()retourneert eigenlijk in beide gevallen false, maar misschien zijn er ingebouwde functies voor Kotlin die men zou kunnen gebruiken?

Er is de statische functie java.utils.Arrays.deepEquals(a.toTypedArray(), b.toTypedArray())maar ik zou liever een instantiemethode gebruiken omdat deze beter zou werken met optionals .


Antwoord 1, autoriteit 100%

In Kotlin 1.1 kun je contentEqualsen contentDeepEqualsom twee arrays te vergelijken voor structurelegelijkheid. bijv.:

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

In Kotlin 1.0 zijn er geen “ingebouwde functies voor de Kotlin std-lib die twee arrays test op (waarde)gelijkheid voor elk element.”

“Arrays worden altijd vergeleken met behulp van equals(), net als alle andere objecten” (Feedbackverzoek: beperkingen op gegevensklassen | Kotlin Blog).

Dus a.equals(b)retourneert alleen trueals aen bnaar dezelfde array verwijzen .

U kunt echter uw eigen “optionele”-vriendelijke methoden maken met behulp van de extensie functies. bijv.:

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

P.S. De opmerkingen op Feedback-verzoek: beperkingen op gegevensklassen | Kotlin Blogzijn ook het lezen waard, met name commentaar 39364.


Antwoord 2, autoriteit 40%

Kotlin 1.1 heeft extensies geïntroduceerd voor het vergelijken van arrays op inhoud:
contentEqualsen contentDeepEquals.

Deze extensies zijn infix, dus u kunt ze op de volgende manier gebruiken:

val areEqual = arr1 contentEquals arr2

Antwoord 3, autoriteit 33%

En als u de inhoud van twee Collectionsde bestelling negeertwilt vergelijken, kunt u deze eenvoudige extensie toevoegen:

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

…en gebruik het als volgt:

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

Other episodes