MutableList.sort în Kotlin

Sortează chiar lista modificabilă (pe loc), crescător, descrescător sau după un câmp; nu întoarce nimic.

Sintaxă
fun <T : Comparable<T>> MutableList<T>.sort()
fun <T : Comparable<T>> MutableList<T>.sortDescending()
fun <T, R : Comparable<R>> MutableList<T>.sortBy(selector: (T) -> R?)
fun <T, R : Comparable<R>> MutableList<T>.sortByDescending(selector: (T) -> R?)
fun <T> MutableList<T>.sortWith(comparator: Comparator<in T>)

Ce face MutableList.sort

sort() schimbă ordinea elementelor în lista existentă, crescător. sortDescending() sortează descrescător, iar sortBy { ... } și sortByDescending { ... } după o cheie calculată (un câmp, o lungime). sortWith primește un Comparator.

Aceste funcții întorc Unit (nimic): rezultatul este lista însăși. Merg doar pe MutableList (și pe tablouri). Variantele cu -ed (sorted, sortedBy) întorc o listă nouă și lasă originalul neschimbat.

Parametri

Parametru Descriere
selector La sortBy: funcția care dă cheia de sortare.
comparator La sortWith: regula de comparare.

Ce returnează

Nimic (Unit); lista este sortată pe loc.

Exemple

Exemplul 1: sort și sortDescending

Aceeași listă este sortată întâi crescător, apoi descrescător. Nu creăm liste noi.

fun main() {
    val preturi = mutableListOf(45, 12, 99, 30)
    preturi.sort()
    println(preturi)
    preturi.sortDescending()
    println(preturi)
}

Rezultat

[12, 30, 45, 99]
[99, 45, 30, 12]

Exemplul 2: sortBy pe obiecte

Sortăm elevii după medie, descrescător, și afișăm clasamentul.

data class Elev(val nume: String, var medie: Double)

fun main() {
    val elevi = mutableListOf(Elev("Ana", 8.9), Elev("Ion", 9.6), Elev("Maria", 9.1))
    elevi.sortByDescending { it.medie }
    elevi.forEachIndexed { i, e -> println("${i + 1}. ${e.nume} ${e.medie}") }

    elevi.sortBy { it.nume }
    println(elevi.map { it.nume })
}

Rezultat

1. Ion 9.6
2. Maria 9.1
3. Ana 8.9
[Ana, Ion, Maria]

Exemplul 3: sort față de sorted

sorted() nu atinge lista a. sort() schimbă lista b. println(b.sort()) ar afișa kotlin.Unit.

fun main() {
    val a = mutableListOf(3, 1, 2)
    val noua = a.sorted()
    println("a = $a, noua = $noua")

    val b = mutableListOf(3, 1, 2)
    b.sort()
    println("b = $b")
}

Rezultat

a = [3, 1, 2], noua = [1, 2, 3]
b = [1, 2, 3]

Greșeli frecvente

  • Scrii val sortata = lista.sort(): sortata este Unit. Folosește sorted() dacă vrei o listă nouă.
  • Apelezi sort() pe o List (doar citire): nu compilează. Folosește sorted() sau transformă cu toMutableList().

Comenzi înrudite

  • Iterable.sorted: Întoarce o listă nouă cu elementele în ordine crescătoare (sorted) sau descrescătoare (sortedDescending).
  • Iterable.sortedBy: Sortează elementele după valoarea calculată de o funcție, de exemplu elevii după medie sau orașele după populație.
  • Iterable.sortedWith: Sortează după un Comparator: mai multe criterii cu compareBy/thenBy sau ordine românească cu Collator.
  • Array.sort: Sortează crescător elementele tabloului chiar în tablou (îl modifică, nu creează altul).
  • MutableList.shuffle: Amestecă pe loc elementele unei liste modificabile, într-o ordine aleatorie.