網頁

2024/3/24

Golang struct slice排序

Go對包含struct元素的slice的排序方式如下。


sort.SliceStable

使用sort.SliceStableslices.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.Slicesort.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}]
}


沒有留言:

張貼留言