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) == 1sau== -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ștea.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.