sort
TIP
Jika Anda adalah pengembang versi 1.21 atau lebih tinggi, saya sarankan menggunakan pustaka standar slices untuk pengurutan, karena mendukung generik dan desain API yang lebih masuk akal.
Package sort di Go menyediakan metode pengurutan yang diimplementasikan secara resmi, sebagian besar dapat langsung digunakan. Jika ingin mengurutkan struct, harus mengimplementasikan tiga metode Len() Less() Swap() di bawah sort.Interface. Karena官方 sudah mengimplementasikan tiga tipe Float64Slice StringSlice IntSlice untuk kita, jadi ketiga tipe ini dapat langsung digunakan tanpa perlu mengimplementasikannya sendiri.
type Interface interface {
// Metode panjang
Len() int
// Metode perbandingan
Less(i, j int) bool
// Metode pertukaran
Swap(i, j int)
}Pengurutan Integer
func main() {
ints := []int{1, 2, 3, 111, 5, 99, 23, 5, 66}
sort.Ints(ints)
}Pengurutan Floating Point
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)
}Pengurutan String
func main() {
strings := []string{"helloworld", "aaa", "bbb", "ccc"}
sort.Strings(strings)
}Pengurutan Terbalik
Perlu dikemas dengan sort.Reverse terlebih dahulu sebelum melakukan pengurutan
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)
}Pengurutan Kustom
Jika ingin mengurutkan struct secara kustom, harus mengimplementasikan tiga metode.
type Person struct {
UserId string
Username string
Age int
Address string
}
type PersonSlice []Person
// Mengembalikan panjang slice
func (p PersonSlice) Len() int {
return len(p)
}
// Metode perbandingan
func (p PersonSlice) Less(i, j int) bool {
return p[i].Age < p[j].Age
}
// Metode pertukaran
func (p PersonSlice) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}Karena perbandingan berdasarkan usia, hasilnya diurutkan berdasarkan besar kecilnya usia.
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)
}Apakah Terurut
Menentukan apakah sebuah slice terurut, secara internal tidak akan melakukan operasi pengurutan, tetapi melalui loop memanggil Less() untuk menentukan
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)))
}