Comparable.compareTo în Kotlin

Comparare și timp Kotlin 1.0

compareTo compară două obiecte și dă un număr negativ, 0 sau pozitiv; compareValues face la fel și acceptă null.

Sintaxă
operator fun compareTo(other: T): Int
fun <T : Comparable<*>> compareValues(a: T?, b: T?): Int

Ce face Comparable.compareTo

Interfața Comparable<T> are o singură funcție, compareTo(other), care returnează un număr negativ dacă obiectul este mai mic decât other, 0 dacă sunt egale și un număr pozitiv dacă este mai mare. Numerele, textele și datele o implementează deja.

Fiind operator, compareTo este folosită automat de <, >, <=, >=: a < b înseamnă a.compareTo(b) < 0. Dacă o clasă proprie implementează Comparable, poți folosi aceste semne, sorted(), max() și maxOf pe obiectele ei.

compareValues(a, b) compară două valori care pot fi null; null este considerat mai mic decât orice valoare. Este utilă când scrii de mână un compareTo sau un comparator.

Parametri

Parametru Descriere
other: T Obiectul cu care se compară.

Ce returnează

Un Int: negativ, 0 sau pozitiv. Contează doar semnul, nu mărimea.

Exemple

Exemplul 1: compareTo pe numere și texte

Textele se compară caracter cu caracter, după codul fiecărui caracter. Rezultatul exact poate fi orice număr, contează semnul.

fun main() {
    println(5.compareTo(9))
    println(9.compareTo(9))
    println("Ion".compareTo("Ana") > 0)
    println("ana" < "bob")
    println(compareValues(3, 7))
    println(compareValues(null, 7))
    println(compareValues("Iași", null))
}

Rezultat

-1
0
true
true
-1
-1
1

Exemplul 2: O clasă proprie Comparable

Versiunile se compară întâi după numărul major, apoi după cel minor. După implementare, <, sorted() și max() funcționează direct.

data class Versiune(val major: Int, val minor: Int) : Comparable<Versiune> {
    override fun compareTo(other: Versiune): Int {
        if (major != other.major) return major.compareTo(other.major)
        return minor.compareTo(other.minor)
    }
    override fun toString() = "$major.$minor"
}

fun main() {
    val v = listOf(Versiune(2, 1), Versiune(1, 9), Versiune(2, 0))
    println(Versiune(1, 9) < Versiune(2, 0))
    println(v.sorted())
    println(v.max())
}

Rezultat

true
[1.9, 2.0, 2.1]
2.1

Greșeli frecvente

  • Verifici a.compareTo(b) == 1 sau == -1. Contractul promite doar semnul: verifică > 0 și < 0.
  • Scrii compareTo prin scădere: return a - b. La numere foarte mari scăderea depășește Int și dă semnul greșit; folosește a.compareTo(b).

Comenzi înrudite

  • compareBy: Creează un Comparator care compară obiectele după una sau mai multe proprietăți, în ordine; se folosește cu sortedWith.
  • maxOf: Returnează cea mai mare (maxOf) sau cea mai mică (minOf) dintre două sau mai multe valori comparabile.
  • String.equals: equals compară două texte (opțional fără să conteze literele mari); compareTo le compară alfabetic.