5.9、Golang标准库-sort
sort包提供了切片排序
排序示例
go
package main
import (
"fmt"
"sort"
)
func main() {
s := []int{3, 4, 1, 2}
sort.Ints(s)
fmt.Printf("s: %v\n", s)
// s: [1 2 3 4]
}
接口
go
type Interface interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
}
自定义排序
实现接口示例
go
package main
import (
"fmt"
"sort"
)
type NewInts []uint
func (n NewInts) Len() int {
return len(n)
}
func (n NewInts) Less(i, j int) bool {
return n[i] < n[j]
}
func (n NewInts) Swap(i, j int) {
n[i], n[j] = n[j], n[i]
}
func main() {
s := []uint{3, 4, 1, 2}
sort.Sort(NewInts(s))
fmt.Printf("s: %v\n", s)
// s: [1 2 3 4]
}
浮点数切片
go
package main
import (
"fmt"
"sort"
)
func main() {
s := []float64{3.1, 4.2, 1.9, 2.0}
sort.Float64s(s)
fmt.Printf("s: %v\n", s)
// s: [1.9 2 3.1 4.2]
}
字母字符串切片
go
package main
import (
"fmt"
"sort"
)
func main() {
s := []string{"tom", "jack", "steve"}
sort.Strings(s)
fmt.Printf("s: %v\n", s)
// s: [jack steve tom]
}
数字字符串切片
go
package main
import (
"fmt"
"sort"
)
func main() {
s := []string{"23", "12", "54"}
sort.Strings(s)
fmt.Printf("s: %v\n", s)
// s: [12 23 54]
}
中文字符串切片
go
package main
import (
"fmt"
"sort"
)
func main() {
s := []string{"喔", "啊", "饿"}
sort.Strings(s)
fmt.Printf("s: %v\n", s)
// s: [啊 喔 饿]
for _, v := range s {
fmt.Printf("v: %v %v\n", v, []byte(v))
}
// 一个汉字占3个字节
// v: 啊 [229 149 138]
// v: 喔 [229 150 148]
// v: 饿 [233 165 191]
}
二维切片排序
go
package main
import (
"fmt"
"sort"
)
type Array [][]int
// 实现接口
func (array Array) Len() int {
return len(array)
}
func (array Array) Less(i, j int) bool {
// 按照第二个值进行比较
return array[i][1] < array[j][1]
}
func (array Array) Swap(i, j int) {
array[i], array[j] = array[j], array[i]
}
func main() {
s := [][]int{
{1, 2},
{3, 6},
{4, 5},
}
sort.Sort(Array(s))
fmt.Printf("s: %v\n", s)
// s: [[1 2] [4 5] [3 6]]
}
map切片排序
go
package main
import (
"fmt"
"sort"
)
type MapSlice []map[string]int
// 实现接口
func (ml MapSlice) Len() int {
return len(ml)
}
func (ml MapSlice) Less(i, j int) bool {
// 按照age 年龄值进行比较
return ml[i]["age"] < ml[j]["age"]
}
func (ml MapSlice) Swap(i, j int) {
ml[i], ml[j] = ml[j], ml[i]
}
func main() {
s := MapSlice{
{"money": 10, "age": 21},
{"money": 11, "age": 20},
{"money": 12, "age": 22},
}
sort.Sort(s)
fmt.Printf("s: %v\n", s)
// s: [
// map[age:20 money:11]
// map[age:21 money:10]
// map[age:22 money:12]
// ]
}
结构体切片排序
go
package main
import (
"fmt"
"sort"
)
type People struct {
Name string
Age int
}
type PeopleSlice []People
// 实现接口
func (s PeopleSlice) Len() int {
return len(s)
}
func (s PeopleSlice) Less(i, j int) bool {
// 按照age 年龄值进行比较
return s[i].Age < s[j].Age
}
func (s PeopleSlice) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
func main() {
s := PeopleSlice{
{Name: "Tom", Age: 21},
{Name: "Jack", Age: 20},
{Name: "Steve", Age: 22},
}
sort.Sort(s)
fmt.Printf("s: %v\n", s)
// s: [{Jack 20} {Tom 21} {Steve 22}]
}