sort
TIP
Nếu bạn là nhà phát triển phiên bản 1.21 trở lên, tôi khuyên dùng thư viện chuẩn slices để sắp xếp, nó hỗ trợ generics, thiết kế API hợp lý hơn.
Gói sort trong Go cung cấp các phương thức sắp xếp do chính thức triển khai, hầu hết có thể sử dụng ngay. Nếu muốn sắp xếp struct thì phải thực hiện ba phương thức Len() swap() Less() trong sort.Interface. Vì chính thức đã triển khai sẵn ba kiểu Float64Slice StringSlice IntSlice, nên ba kiểu này có thể sử dụng trực tiếp mà không cần tự triển khai.
type Interface interface {
// Phương thức độ dài
Len() int
// Phương thức so sánh
Less(i, j int) bool
// Phương thức hoán đổi
Swap(i, j int)
}Sắp xếp số nguyên
func main() {
ints := []int{1, 2, 3, 111, 5, 99, 23, 5, 66}
sort.Ints(ints)
}Sắp xếp số dấu phẩy động
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)
}Sắp xếp chuỗi
func main() {
strings := []string{"helloworld", "aaa", "bbb", "ccc"}
sort.Strings(strings)
}Sắp xếp ngược
Cần đóng gói bằng sort.Reverse trước khi sắp xếp
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)
}Sắp xếp tùy chỉnh
Nếu muốn sắp xếp struct tùy chỉnh thì phải thực hiện ba phương thức.
type Person struct {
UserId string
Username string
Age int
Address string
}
type PersonSlice []Person
// Trả về độ dài slice
func (p PersonSlice) Len() int {
return len(p)
}
// Phương thức so sánh
func (p PersonSlice) Less(i, j int) bool {
return p[i].Age < p[j].Age
}
// Phương thức hoán đổi
func (p PersonSlice) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}Vì so sánh dựa trên tuổi, nên kết quả được sắp xếp theo độ lớn của tuổi.
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)
}Có được sắp xếp không
Kiểm tra một slice có được sắp xếp không, bên trong không thực hiện thao tác sắp xếp mà thông qua việc gọi vòng lặp Less() để kiểm tra
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)))
}