首页 > 解决方案 > 如何检查自定义结构的切片是否已排序?

问题描述

我们可以检查一段字符串是否被排序

var slice = []string { "a", "b }

sort.StringsAreSorted(slice)

但是当你有 struct 并且你想知道该 struct 的切片是否按某个成员排序时呢?

type Person struct {
  Name string
  LastName string
}

var p = []Person{ {"John", "Smith" }, { "Ben", "Smith" } }

sort.StringsAreSorted(p???)

标签: sortinggoslice

解决方案


如果您的类型实现sort.Interface了,只需使用该sort.IsSorted()函数。

如果没有,您可以使用sort.SliceIsSorted(),传递一个less()决定/指定 order(ing) 的函数:

sortedByName := sort.SliceIsSorted(p, func(i, j int) bool {
    return p[i].Name < p[j].Name
})
fmt.Println("Sorted by name:", sortedByName)

sortedByLastName := sort.SliceIsSorted(p, func(i, j int) bool {
    return p[i].LastName < p[j].LastName
})
fmt.Println("Sorted by last name:", sortedByLastName)

这将输出(在Go Playground上尝试):

Sorted by name: false
Sorted by last name: true

如果您查看这些函数的实现,它们会使用一个简单的循环来迭代元素并判断彼此相邻的元素是否不违反排序(less()函数)。您也可以轻松地使用 for 循环。


推荐阅读