Map.toSortedMap în Kotlin

Map-uri (dicționare) Kotlin 1.0 (JVM)

Creează un map nou cu cheile ordonate (crescător sau după un comparator), care rămâne sortat și după adăugări.

Sintaxă
fun <K : Comparable<K>, V> Map<out K, V>.toSortedMap(): SortedMap<K, V>
fun <K, V> Map<out K, V>.toSortedMap(comparator: Comparator<in K>): SortedMap<K, V>

Ce face Map.toSortedMap

toSortedMap() copiază intrările într-un SortedMap (pe JVM, un java.util.TreeMap), în care cheile sunt mereu în ordine crescătoare. Și cheile adăugate ulterior își găsesc singure locul.

Cu un comparator poți alege altă ordine, de exemplu reverseOrder() pentru descrescător. Ordinea este după chei; pentru a ordona după valori, transformă în listă și folosește sortedBy { it.value }.

Parametri

Parametru Descriere
comparator Opțional: regula de ordonare a cheilor.

Ce returnează

Un SortedMap<K, V> nou, modificabil.

Exemple

Exemplul 1: Orașe în ordine alfabetică

Map-ul original are ordinea de inserare. Copia sortată are cheile în ordine; „Arad”, adăugat după, intră primul.

fun main() {
    val distante = mapOf("Iași" to 400, "Cluj" to 450, "Brașov" to 170)
    val sortat = distante.toSortedMap()
    println(distante)
    println(sortat)
    sortat["Arad"] = 550
    println(sortat)
    println("Primul: ${sortat.firstKey()}")
}

Rezultat

{Iași=400, Cluj=450, Brașov=170}
{Brașov=170, Cluj=450, Iași=400}
{Arad=550, Brașov=170, Cluj=450, Iași=400}
Primul: Arad

Exemplul 2: Ordine descrescătoare și ordonare după valori

reverseOrder() inversează ordinea cheilor (anii). Pentru ordine după valoare folosim entries.sortedByDescending.

fun main() {
    val absolventi = mapOf(2022 to 120, 2024 to 95, 2023 to 140)
    println(absolventi.toSortedMap(reverseOrder()))
    println(absolventi.entries.sortedByDescending { it.value }.map { it.key })
}

Rezultat

{2024=95, 2023=140, 2022=120}
[2023, 2022, 2024]

Greșeli frecvente

  • Aștepți ca toSortedMap() să ordoneze după valori: ordonează după chei.
  • Sortezi chei de tip text cu diacritice și „Ștei” apare după „Zalău”. Dă un comparator: toSortedMap(Collator.getInstance(Locale.forLanguageTag("ro"))).

Comenzi înrudite

  • Iterable.sortedBy: Sortează elementele după valoarea calculată de o funcție, de exemplu elevii după medie sau orașele după populație.
  • Map.keys: Proprietățile keys, values și entries dau cheile, valorile și perechile cheie–valoare ale unui map.
  • hashMapOf: Creează un map modificabil de un tip anume: HashMap (fără ordine), LinkedHashMap (ordinea inserării) sau SortedMap (chei sortate).
  • Iterable.groupBy: Împarte elementele în grupe după o cheie și întoarce un map: cheie → lista elementelor din acea grupă.