如何检查自定义结构的切片是否已排序



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

var slice = []string { "a", "b }
sort.StringsAreSorted(slice)

但是,当您有结构并且想知道该结构的一部分是否按某个成员排序时呢?

type Person struct {
  Name string
  LastName string
}
var p = []Person{ {"John", "Smith" }, { "Ben", "Smith" } }
sort.StringsAreSorted(p???)

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

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

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 循环。

最新更新