Lektionen des Moduls (5/5)
Sortieren mit dem sort-Package
Das Standardpaket sort sortiert Slices an Ort und Stelle. Für Grundtypen
(int, float64, string) es gibt direkte Helfer; für jedes andere Stück
Sie verwenden sort.Slice mit einer Funktion less(i, j int) bool, die definiert
die Sortierung.
Helfer für Basistypen
import "sort"
nums := []int{5, 2, 8, 1}
sort.Ints(nums) // [1 2 5 8]
words := []string{"c", "a", "b"}
sort.Strings(words) // [a b c]
fs := []float64{1.5, 0.5, 2.5}
sort.Float64s(fs) // [0.5 1.5 2.5]Die Sortierung erfolgt in-place: Das Original-Slice ist mutiert.
sort.Slice: benutzerdefinierte Sortierung
Sie übergeben das Slice und eine Funktion less, die bei zwei Indizes i und j
gibt true zurück, wenn das Element i vor j stehen muss:
type Person struct {
Name string
Age int
}
people := []Person{
{"Bruno", 30},
{"Anna", 25},
{"Carla", 28},
}
sort.Slice(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})
// Anna(25), Carla(28), Bruno(30)Um umgekehrt zu sortieren, tauschen Sie einfach den Vergleich aus:
return people[i].Age > people[j].Age.
Stabile Bestellung
sort.Slice ist nicht garantiert stabil („gleiche“ Elemente können sich ändern
relative Reihenfolge). Für eine stabile Sortierung verwenden Sie sort.SliceStable:
sort.SliceStable(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})Sortieren nach mehreren Schlüsseln
Gängiges Muster: Sortieren nach Alter und bei gleichem Alter nach Namen:
sort.Slice(people, func(i, j int) bool {
if people[i].Age != people[j].Age {
return people[i].Age < people[j].Age
}
return people[i].Name < people[j].Name
})Binäre Suche
sort.SearchInts / sort.Search Arbeit an bereits sortierten Slices:
nums := []int{1, 3, 5, 7, 9}
i := sort.SearchInts(nums, 5) // 2Wenn das Element nicht vorhanden ist, wird der Einfügeindex zurückgegeben. Sie finden es in Details, wenn Sie sie brauchen.
Generika (Go 1.21+): slices.Sort
Aus dem slices-Paket der stdlib (Go 1.21):
import "slices"
nums := []int{3, 1, 2}
slices.Sort(nums) // [1 2 3]
slices.SortFunc(people, func(a, b Person) int {
return a.Age - b.Age // -1/0/1
})Modernere und typsicherere API. Kompatibel mit sort.Slice, aber mehr
ergonomisch.
Probieren Sie es selbst aus
Sortieren Sie Zahlen aufsteigend mit sort.Ints.
Hinweis anzeigen
`sort.Ints` sortiert ein Int-Slice direkt.
Lösung nach 3 Versuchen verfügbar
Sortieren Sie Personen mit sort.Slice aufsteigend nach Alter.
Hinweis anzeigen
Die Funktion „less“ gibt „true“ zurück, wenn das Element i VOR j stehen muss.
Lösung nach 3 Versuchen verfügbar
Wie sortiert man mit sort.Slice in absteigender Reihenfolge?
sort.Slice(s, func(i, j int) bool { return ??? })Zusammenfassung
sort.Ints/sort.Strings/sort.Float64sfür einfache, direkte Typen.sort.Slice(s, less)für Slices jeglicher Art, mit Funktionless(i, j).sort.SliceStable, um die relative Reihenfolge mit demselben Schlüssel beizubehalten.- Sortieren nach mehreren Schlüsseln: Kaskade von
ifinless. - Go 1.21+:
slicesPaket mit generischer API (slices.Sort,slices.SortFunc). - Für Kartenschlüssel: In Slices extrahieren und sortieren.