Operatory porównania
compareTo i equals
Operatory porównania to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Porównywanie typów niestandardowych
Aby używać operatorów <, >, <= i >= dla własnego typu, należy zdefiniować operator fun compareTo zwracającą wartość typu Int.
data class Money(val cents: Int) {
operator fun compareTo(o: Money) = cents - o.cents
}
fun main() {
println(Money(500) > Money(200))
}Kontrakt compareTo
compareTo zwraca liczbę ujemną, gdy receiver jest mniejszy, zero, gdy wartości są równe, oraz liczbę dodatnią, gdy receiver jest większy.
data class Version(val n: Int) {
operator fun compareTo(o: Version) = n - o.n
}
fun main() {
println(Version(2).compareTo(Version(5)))
}Implementowanie Comparable
Implementowanie interfejsu Comparable<T> jest idiomatycznym podejściem, a jego metoda compareTo jest już operatorem.
data class Score(val value: Int) : Comparable<Score> {
override fun compareTo(other: Score) = value - other.value
}
fun main() {
println(Score(10) < Score(20))
}Sortowanie za pomocą Comparable
Gdy typ implementuje Comparable, funkcje kolekcji, takie jak sorted(), działają automatycznie.
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 })
}Używanie compareValuesBy
W przypadku porównywania wielu pól funkcja compareValuesBy porównuje je według kolejnych selektorów.
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"))
}Równość za pomocą equals
Operator == wywołuje equals, a nie compareTo. Należy przesłonić equals, aby określić zasady równości wartości.
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 i hashCode razem
Jeśli przesłonią Państwo equals, należy również przesłonić hashCode, aby równe obiekty miały ten sam skrót i aby kolekcje oparte na skrótach działały poprawnie.
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)
}Klasy danych robią to za Państwa
data class automatycznie generuje equals i hashCode na podstawie właściwości, dzięki czemu == porównuje wartości.
data class Coord(val x: Int, val y: Int)
fun main() {
println(Coord(1, 2) == Coord(1, 2))
}Równość a tożsamość
== wywołuje equals (równość wartości), natomiast === sprawdza tożsamość referencji. Wyniki tych porównań mogą się różnić.
data class Box(val n: Int)
fun main() {
val a = Box(1)
val b = Box(1)
println(a == b)
println(a === b)
}Porównywanie w warunkach
Po zdefiniowaniu compareTo własny typ działa w instrukcjach if i when tak jak liczby.
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 i minOf
Typy implementujące Comparable współpracują z funkcjami maxOf i 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)
}Szybkie sprawdzenie
Proszę sprawdzić swoją znajomość operatorów porównania.
Podsumowanie
W tej części poznali Państwo operatory porównania:
compareToobsługuje operatory<,>,<=i>=, zwracając wartość ujemną, zero lub dodatnią.- Należy implementować
Comparable<T>, aby uzyskać idiomatyczne porządkowanie i sortowanie. ==używaequals, które zawsze należy uzupełnić przezhashCode.- Klasy danych automatycznie generują
equalsihashCode.
data class S(val v: Int) : Comparable<S> {
override fun compareTo(other: S) = v - other.v
}
fun main() {
println(S(2) < S(5))
}Często zadawane pytania
Czy lekcja „Operatory porównania” jest bezpłatna?
Tak — pełny tekst „Operatory porównania” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Operatory porównania”?
compareTo i equals Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?
Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Operatory porównania”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?
Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Funkcje operatorowe
- Operatory porównania
- Indeksowanie i invoke
- Najlepsze praktyki