Go 自定义排序

有的时候我们希望排序不是仅仅按照自然顺序排序。例如,我们希望按照字符串的长度来对一个字符串数组排序而不是按照字母顺序来排序。这里我们介绍一下Go的自定义排序。

  1. package main
  2. import "sort"
  3. import "fmt"
  4. // 为了能够使用自定义函数来排序,我们需要一个
  5. // 对应的排序类型,比如这里我们为内置的字符串
  6. // 数组定义了一个别名ByLength
  7. type ByLength []string
  8. // 我们实现了sort接口的Len,Less和Swap方法
  9. // 这样我们就可以使用sort包的通用方法Sort
  10. // Len和Swap方法的实现在不同的类型之间大致
  11. // 都是相同的,只有Less方法包含了自定义的排序
  12. // 逻辑,这里我们希望以字符串长度升序排序
  13. func (s ByLength) Len() int {
  14. return len(s)
  15. }
  16. func (s ByLength) Swap(i, j int) {
  17. s[i], s[j] = s[j], s[i]
  18. }
  19. func (s ByLength) Less(i, j int) bool {
  20. return len(s[i]) < len(s[j])
  21. }
  22. // 一切就绪之后,我们就可以把需要进行自定义排序
  23. // 的字符串类型fruits转换为ByLength类型,然后使用
  24. // sort包的Sort方法来排序
  25. func main() {
  26. fruits := []string{"peach", "banana", "kiwi"}
  27. sort.Sort(ByLength(fruits))
  28. fmt.Println(fruits)
  29. }

输出结果

  1. [kiwi peach banana]

同样的,对于其他的类型,使用这种方法,我们可以为Go的切片提供任意的排序方法。归纳一下就是:

  1. 创建自定义排序类型
  2. 实现sort包的接口方法Len,Swap和Less
  3. 使用sort.Sort方法来排序