Go對包含struct元素的slice的排序方式如下。
sort.SliceStable
使用sort.SliceStable
或slices.SortStableFunc
搭配cam.Compare
對slice進行排序。官方建議使用較新的slices.SortStableFunc
,速度較快。
main.go
package main
import (
"cmp"
"fmt"
"slices"
"sort"
)
type Employee struct {
Id int64
Name string
Age int
}
func main() {
emps := []Employee{
{3, "Tony", 40},
{2, "Mary", 28},
{1, "John", 33},
}
fmt.Println(emps) // [{3 Tony 40} {2 Mary 28} {1 John 33}]
sort.SliceStable(emps, func(i, j int) bool {
return emps[i].Id < emps[j].Id // ascending by Id
})
fmt.Println(emps) // [{1 John 33} {2 Mary 28} {3 Tony 40}]
slices.SortStableFunc(emps, func(a, b Employee) int {
return -cmp.Compare(a.Age, b.Age) // decending by Age
})
fmt.Println(emps) // [{3 Tony 40} {1 John 33} {2 Mary 28}]
}
另一個類似的sort.Slice
和sort.SliceStable
的差異是不保證兩相同元素的順序和原本一樣。
實作sort.Interface
或是宣告slice為一資料型態,並實作sort.Interface
介面,然後用sort.Stabel
排序。
main.go
package main
import (
"fmt"
"sort"
)
type Employee struct {
Id int64
Name string
Age int
}
type Employees []Employee
func (emps Employees) Len() int {
return len(emps)
}
func (emps Employees) Less(i, j int) bool {
return emps[i].Id < emps[j].Id
}
func (emps Employees) Swap(i, j int) {
emps[i], emps[j] = emps[j], emps[i]
}
func main() {
emps := Employees{
{3, "Tony", 40},
{2, "Mary", 28},
{1, "John", 33},
}
fmt.Println(emps) // [{3 Tony 40} {2 Mary 28} {1 John 33}]
sort.Stable(emps)
fmt.Println(emps) // [{1 John 33} {2 Mary 28} {3 Tony 40}]
sort.Stable(sort.Reverse(emps))
fmt.Println(emps) // [{3 Tony 40} {2 Mary 28} {1 John 33}]
}
沒有留言:
張貼留言