slices.Sorted în Go

Strânge valorile unui iterator într-un slice nou și îl sortează: Sorted (ordine naturală), SortedFunc și SortedStableFunc (comparație proprie).

Sintaxă
import "slices"

func Sorted[E cmp.Ordered](seq iter.Seq[E]) []E
func SortedFunc[E any](seq iter.Seq[E], cmp func(E, E) int) []E
func SortedStableFunc[E any](seq iter.Seq[E], cmp func(E, E) int) []E

Ce face slices.Sorted

slices.Sorted(seq) este Collect urmat de Sort: primești un slice nou, sortat crescător. Cea mai folosită formă este slices.Sorted(maps.Keys(m)), care dă cheile unui map în ordine, ca să le parcurgi sau afișezi mereu la fel.

slices.SortedFunc(seq, cmp) sortează după o funcție de comparare (negativ, 0, pozitiv). slices.SortedStableFunc păstrează ordinea din iterator pentru elementele egale.

Spre deosebire de slices.Sort, aceste funcții nu modifică nimic: creează mereu un slice nou.

Parametri

Parametru Descriere
seq Iteratorul ale cărui valori le sortezi.
cmp Pentru variantele Func: funcția de comparare.

Ce returnează

Un slice nou, sortat.

Exemple

Exemplul 1: Parcurgerea unui map în ordinea cheilor

package main

import (
    "fmt"
    "maps"
    "slices"
)

func main() {
    populatie := map[string]int{"Iași": 271692, "Cluj-Napoca": 286598, "Brașov": 237589, "Arad": 145078}
    for _, oras := range slices.Sorted(maps.Keys(populatie)) {
        fmt.Printf("%-12s %d\n", oras, populatie[oras])
    }
}

Rezultat

Arad         145078
Brașov       237589
Cluj-Napoca  286598
Iași         271692

Exemplul 2: Valori sortate descrescător și sortare stabilă

SortedStableFunc sortează după lungimea cuvântului; cuvintele de aceeași lungime rămân în ordinea din slice.

package main

import (
    "cmp"
    "fmt"
    "maps"
    "slices"
)

func main() {
    note := map[string]int{"Ana": 9, "Mihai": 7, "Ioana": 10}
    desc := slices.SortedFunc(maps.Values(note), func(a, b int) int { return cmp.Compare(b, a) })
    fmt.Println(desc)

    cuvinte := []string{"mere", "kiwi", "pere", "ananas", "fig"}
    dupaLungime := slices.SortedStableFunc(slices.Values(cuvinte), func(a, b string) int {
        return cmp.Compare(len(a), len(b))
    })
    fmt.Println(dupaLungime)
}

Rezultat

[10 9 7]
[fig mere kiwi pere ananas]

Greșeli frecvente

  • Dai un slice direct: slices.Sorted(s) nu compilează, funcția cere un iterator. Pentru un slice scrie slices.Sorted(slices.Values(s)) sau sortează o copie cu slices.Sort.

Comenzi înrudite

  • slices.Collect: Collect strânge valorile unui iterator într-un slice nou; AppendSeq le adaugă la finalul unui slice existent.
  • slices.Sort: Sortează crescător, pe loc, un slice de orice tip ordonat (numere, texte).
  • slices.SortFunc: Sortează un slice după o funcție de comparare care returnează negativ, zero sau pozitiv; SortStableFunc păstrează ordinea celor egali.
  • maps.Keys: Returnează un iterator peste cheile (Keys) sau valorile (Values) unui map, în ordine aleatorie.