0Pricing
Kotlin Academy · Lektion

Vergleichsoperatoren

compareTo und equals

Vergleichsoperatoren ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Benutzerdefinierte Typen vergleichen

Um <, >, <= und >= für Ihren Typ zu verwenden, definieren Sie eine operator fun compareTo, die einen Int zurückgibt.

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

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

Der compareTo-Vertrag

compareTo gibt eine negative Zahl zurück, wenn der Receiver kleiner ist, null bei Gleichheit und eine positive Zahl, wenn er größer ist.

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

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

Comparable implementieren

Das Implementieren des Interfaces Comparable<T> ist der idiomatische Ansatz; dessen compareTo ist bereits ein Operator.

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

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

Mit Comparable sortieren

Sobald ein Typ Comparable ist, funktionieren Collection-Funktionen wie sorted() automatisch.

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 })
}

compareValuesBy verwenden

Bei Vergleichen über mehrere Felder vergleicht compareValuesBy die einzelnen Selektoren in ihrer Reihenfolge.

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"))
}

Gleichheit mit equals

Der Operator == ruft equals auf, nicht compareTo. Überschreiben Sie equals, um die Wertgleichheit zu steuern.

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 und hashCode gemeinsam

Wenn Sie equals überschreiben, müssen Sie auch hashCode überschreiben, damit gleiche Objekte denselben Hashwert haben und hashbasierte Collections korrekt funktionieren.

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 Classes erledigen das für Sie

Eine data class generiert equals und hashCode automatisch aus ihren Properties, sodass == Werte vergleicht.

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

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

Gleichheit oder Identität

== ruft equals auf (Wertgleichheit), während === die Referenzidentität prüft. Die Ergebnisse können sich unterscheiden.

data class Box(val n: Int)

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

Vergleiche in Bedingungen

Wenn compareTo definiert ist, funktioniert Ihr Typ in if und when wie Zahlen.

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 und minOf

Comparable-Typen funktionieren mit maxOf und 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)
}

Kurzer Test

Testen Sie Ihr Verständnis von Vergleichsoperatoren.

Zusammenfassung

Sie haben Vergleichsoperatoren kennengelernt:

  • compareTo steht hinter <, >, <= und >= und gibt einen negativen Wert, null oder einen positiven Wert zurück.
  • Implementieren Sie Comparable<T> für eine idiomatische Sortierreihenfolge und Sortierung.
  • == verwendet equals; kombinieren Sie es immer mit hashCode.
  • Data Classes generieren equals und hashCode automatisch.
data class S(val v: Int) : Comparable<S> {
    override fun compareTo(other: S) = v - other.v
}

fun main() {
    println(S(2) < S(5))
}

Häufig gestellte Fragen

Ist die Lektion „Vergleichsoperatoren“ kostenlos?

Ja — der vollständige Text von „Vergleichsoperatoren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Vergleichsoperatoren“?

compareTo und equals Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Kotlin Academy zu starten?

Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Vergleichsoperatoren“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?

Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Operatorfunktionen
  2. Vergleichsoperatoren
  3. Index und Invoke
  4. Best Practices
← Zurück zu Kotlin Academy