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:
compareTosteht 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. ==verwendetequals; kombinieren Sie es immer mithashCode.- Data Classes generieren
equalsundhashCodeautomatisch.
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
- Operatorfunktionen
- Vergleichsoperatoren
- Index und Invoke
- Best Practices