sort
TIP
如果你是 1.21 版本以上的開發者,我建議使用slices標准庫來進行排序,它支持泛型,API 設計更加合理。
在 go 中的sort包下提供了官方實現的排序方法,大部分可以直接開箱即用。倘若想要對結構體進行排序的話必須實現sort.Interface下的三個方法Len() swap() Less()。由於官方已經幫我們實現了Float64Slice StringSlice IntSlice三個類型,所以這三個類型可以不用我們自己實現直接使用即可。
go
type Interface interface {
// 長度方法
Len() int
// 比較方法
Less(i, j int) bool
// 交換方法
Swap(i, j int)
}整型排序
go
func main() {
ints := []int{1, 2, 3, 111, 5, 99, 23, 5, 66}
sort.Ints(ints)
}浮點排序
go
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)
}字符串排序
go
func main() {
strings := []string{"helloworld", "aaa", "bbb", "ccc"}
sort.Strings(strings)
}逆向排序
需要先進行sort.Reverse包裝再進行排序
go
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)
}自定義排序
如果想要自定義結構體排序的話,就必須實現三個方法。
go
type Person struct {
UserId string
Username string
Age int
Address string
}
type PersonSlice []Person
//返回切片的長度
func (p PersonSlice) Len() int {
return len(p)
}
//比較方法
func (p PersonSlice) Less(i, j int) bool {
return p[i].Age < p[j].Age
}
//交換方法
func (p PersonSlice) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}由於是根據年齡比較的,所有結果是根據年齡的大小來排序。
go
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)
}是否有序
判斷一個切片是否有序,其內部並不會進行排序操作,而是通過循環調用Less()來判斷
go
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)))
}