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 contentEquals
en contentDeepEquals
om 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 true
als a
en b
naar 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 Collections
de 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