Kotlin Academy · leksjon

Sammenligningsoperatorer

compareTo og equals

Leksjon 2 av 413 trinn

Sammenligningsoperatorer er en gratis leksjon i Kotlin Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Kotlin Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.

Sammenligne egendefinerte typer

For å bruke <, >, <= og >= på typen Deres må De definere en operator fun compareTo som returnerer en Int.

data class Money(val cents: Int) {
    operator fun compareTo(o: Money) = cents - o.cents
}

fun main() {
    println(Money(500) > Money(200))
}

Kontrakten til compareTo

compareTo returnerer et negativt tall hvis mottakeren er mindre, null hvis de er like, og et positivt tall hvis mottakeren er større.

data class Version(val n: Int) {
    operator fun compareTo(o: Version) = n - o.n
}

fun main() {
    println(Version(2).compareTo(Version(5)))
}

Implementere Comparable

Å implementere grensesnittet Comparable<T> er den idiomatiske fremgangsmåten; dets compareTo er allerede en operator.

data class Score(val value: Int) : Comparable<Score> {
    override fun compareTo(other: Score) = value - other.value
}

fun main() {
    println(Score(10) < Score(20))
}

Sortere med Comparable

Når en type er Comparable, fungerer samlingsfunksjoner som sorted() automatisk.

data class Player(val rank: Int) : Comparable<Player> {
    override fun compareTo(other: Player) = rank - other.rank
}

fun main() {
    val sorted = listOf(Player(3), Player(1), Player(2)).sorted()
    println(sorted.map { it.rank })
}

Bruke compareValuesBy

For sammenligninger med flere felt sammenligner compareValuesBy med hver selector i angitt rekkefølge.

data class Person(val age: Int, val name: String) : Comparable<Person> {
    override fun compareTo(other: Person) =
        compareValuesBy(this, other, { it.age }, { it.name })
}

fun main() {
    println(Person(30, "Al") < Person(30, "Bo"))
}

Likhet med equals

Operatoren == kaller equals, ikke compareTo. Overstyr equals for å kontrollere verdilikhet.

class Id(val value: Int) {
    override fun equals(other: Any?) =
        other is Id && other.value == value
    override fun hashCode() = value
}

fun main() {
    println(Id(7) == Id(7))
}

equals og hashCode sammen

Hvis De overstyrer equals, må De også overstyre hashCode, slik at like objekter får samme hashverdi og hash-baserte samlinger forblir korrekte.

class Tag(val name: String) {
    override fun equals(other: Any?) = other is Tag && other.name == name
    override fun hashCode() = name.hashCode()
}

fun main() {
    val set = hashSetOf(Tag("a"), Tag("a"))
    println(set.size)
}

Data-klasser gjør det for Dem

En data class genererer automatisk equals og hashCode fra egenskapene sine, slik at == sammenligner verdier.

data class Coord(val x: Int, val y: Int)

fun main() {
    println(Coord(1, 2) == Coord(1, 2))
}

Likhet kontra identitet

== kaller equals (verdilikhet), mens === kontrollerer referanseidentitet. De kan gi ulike resultater.

data class Box(val n: Int)

fun main() {
    val a = Box(1)
    val b = Box(1)
    println(a == b)
    println(a === b)
}

Sammenligne i betingelser

Når compareTo er definert, fungerer typen Deres i if og when på samme måte som tall.

data class Weight(val g: Int) : Comparable<Weight> {
    override fun compareTo(other: Weight) = g - other.g
}

fun main() {
    val w = Weight(50)
    println(if (w > Weight(40)) "heavy" else "light")
}

maxOf og minOf

Comparable-typer fungerer med maxOf og minOf.

data class T(val v: Int) : Comparable<T> {
    override fun compareTo(other: T) = v - other.v
}

fun main() {
    println(maxOf(T(3), T(8)).v)
}

Rask kontroll

Test forståelsen Deres av sammenligningsoperatorer.

Oppsummering

De har lært om sammenligningsoperatorer:

  • compareTo implementerer <, >, <= og >=, og returnerer negativt, null eller positivt.
  • Implementer Comparable<T> for idiomatisk sorteringsrekkefølge og sortering.
  • == bruker equals; kombiner det alltid med hashCode.
  • Data-klasser genererer equals/hashCode automatisk.
data class S(val v: Int) : Comparable<S> {
    override fun compareTo(other: S) = v - other.v
}

fun main() {
    println(S(2) < S(5))
}
Gratis å komme i gang

Lær deg Kotlin med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
51
Leksjoner
203

Ofte stilte spørsmål

Er leksjonen «Sammenligningsoperatorer» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Kotlin Academy, inkludert «Sammenligningsoperatorer», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Sammenligningsoperatorer»?

compareTo og equals Du øver på Kotlin Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Kotlin Academy?

Ingen tidligere erfaring er nødvendig. Kotlin Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Sammenligningsoperatorer»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Kotlin Academy-leksjonen?

Ja. Alle Kotlin Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Operatorfunksjoner
  2. Sammenligningsoperatorer
  3. Indeksering og invoke
  4. Beste praksis
← Tilbake til Kotlin Academy