0Pricing
Kotlin Academy · Lekcja

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:

  • compareTo obsługuje operatory <, >, <= i >=, zwracając wartość ujemną, zero lub dodatnią.
  • Należy implementować Comparable<T>, aby uzyskać idiomatyczne porządkowanie i sortowanie.
  • == używa equals, które zawsze należy uzupełnić przez hashCode.
  • Klasy danych automatycznie generują equals i hashCode.
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

  1. Funkcje operatorowe
  2. Operatory porównania
  3. Indeksowanie i invoke
  4. Najlepsze praktyki
← Powrót do Kotlin Academy