sort
TIP
Wenn Sie Entwickler mit Version 1.21 oder höher sind, empfehle ich, die slices Standardbibliothek zum Sortieren zu verwenden. Sie unterstützt Generics und die API ist besser gestaltet.
Das sort Paket in Go bietet offiziell implementierte Sortiermethoden, die meistens sofort einsatzbereit sind. Wenn Sie Strukturen sortieren möchten, müssen Sie die drei Methoden Len(), Swap() und Less() aus dem sort.Interface implementieren. Da die offizielle Implementierung bereits Float64Slice, StringSlice und IntSlice bereitstellt, können diese Typen direkt verwendet werden, ohne eigene Implementierung.
type Interface interface {
// Längenmethode
Len() int
// Vergleichsmethode
Less(i, j int) bool
// Tauschmethode
Swap(i, j int)
}Integer-Sortierung
func main() {
ints := []int{1, 2, 3, 111, 5, 99, 23, 5, 66}
sort.Ints(ints)
}Fließkomma-Sortierung
func main() {
floats := []float64{1.0, 2.5, 3.8, 1.11, 5.5, 99.99999, 23.9999, 5.66, 66}
sort.Float64s(floats)
fmt.Println(floats)
}String-Sortierung
func main() {
strings := []string{"helloworld", "aaa", "bbb", "ccc"}
sort.Strings(strings)
}Umgekehrte Sortierung
Zuerst mit sort.Reverse verpacken, dann sortieren
func main() {
floats := []float64{1.0, 2.5, 3.8, 1.11, 5.5, 99.99999, 23.9999, 5.66, 66}
sort.Sort(sort.Reverse(sort.Float64Slice(floats)))
fmt.Println(floats)
}Benutzerdefinierte Sortierung
Wenn Sie benutzerdefinierte Strukturen sortieren möchten, müssen Sie die drei Methoden implementieren.
type Person struct {
UserId string
Username string
Age int
Address string
}
type PersonSlice []Person
// Gibt die Länge des Slices zurück
func (p PersonSlice) Len() int {
return len(p)
}
// Vergleichsmethode
func (p PersonSlice) Less(i, j int) bool {
return p[i].Age < p[j].Age
}
// Tauschmethode
func (p PersonSlice) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}Da nach Alter verglichen wird, werden die Ergebnisse nach Alter sortiert.
func main() {
persons := []Person{{
UserId: "1",
Username: "wyh",
Age: 18,
Address: "us",
}, {
UserId: "2",
Username: "jack",
Age: 17,
Address: "ch",
}, {
UserId: "3",
Username: "mike",
Age: 15,
Address: "india",
}}
sort.Sort(PersonSlice(persons))
fmt.Println(persons)
}Ist sortiert
Prüft, ob ein Slice sortiert ist. Intern wird nicht sortiert, sondern durch wiederholten Aufruf von Less() geprüft.
func main() {
persons := []Person{{
UserId: "1",
Username: "wyh",
Age: 18,
Address: "us",
}, {
UserId: "2",
Username: "jack",
Age: 17,
Address: "ch",
}, {
UserId: "3",
Username: "mike",
Age: 15,
Address: "india",
}}
sort.Sort(PersonSlice(persons))
println(sort.IsSorted(PersonSlice(persons)))
}