sort
TIP
Se sei uno sviluppatore con versione 1.21 o superiore, si consiglia di utilizzare la libreria standard slices per l'ordinamento, supporta i generici e l'API è progettata in modo più ragionevole.
Nel pacchetto sort di Go sono forniti metodi di ordinamento implementati ufficialmente, la maggior parte dei quali può essere utilizzata direttamente. Se si desidera ordinare una struct, è necessario implementare tre metodi sotto sort.Interface: Len(), Swap(), Less(). Poiché l'ufficiale ha già implementato per noi tre tipi Float64Slice, StringSlice, IntSlice, questi tre tipi possono essere utilizzati direttamente senza doverli implementare noi stessi.
type Interface interface {
// Metodo lunghezza
Len() int
// Metodo confronto
Less(i, j int) bool
// Metodo scambio
Swap(i, j int)
}Ordinamento di Interi
func main() {
ints := []int{1, 2, 3, 111, 5, 99, 23, 5, 66}
sort.Ints(ints)
}Ordinamento di Virgole Mobili
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)
}Ordinamento di Stringhe
func main() {
strings := []string{"helloworld", "aaa", "bbb", "ccc"}
sort.Strings(strings)
}Ordinamento Inverso
È necessario prima avvolgere con sort.Reverse e poi ordinare
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)
}Ordinamento Personalizzato
Se si desidera ordinare una struct personalizzata, è necessario implementare tre metodi.
type Person struct {
UserId string
Username string
Age int
Address string
}
type PersonSlice []Person
// Restituisce la lunghezza della slice
func (p PersonSlice) Len() int {
return len(p)
}
// Metodo confronto
func (p PersonSlice) Less(i, j int) bool {
return p[i].Age < p[j].Age
}
// Metodo scambio
func (p PersonSlice) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}Poiché il confronto è basato sull'età, il risultato è ordinato in base alla grandezza dell'età.
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)
}Verifica Se Ordinato
Verifica se una slice è ordinata, internamente non esegue operazioni di ordinamento, ma utilizza un ciclo chiamando Less() per verificare
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)))
}