sorting - 如何检查自定义结构的切片是否已排序?
问题描述
我们可以检查一段字符串是否被排序
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???)
解决方案
如果您的类型实现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 循环。
推荐阅读
- python - Python:在元组列表中找到包含特定字符串的单词
- java - 您好,每次我调用存在于名为“Firstfragment”的片段中的 Spinner 时,我的应用程序都会崩溃
- netlogo - 有没有办法将文本字符串作为命令执行?
- html - 网页结构在缩放时未保持对齐
- sql-server - 如何在 SQL 查询中跳过空格
- angular - 如何在 PrimeNg 编辑器中获得 @ 提及(Angular 中的 Quill + quill-mention)
- excel - 试图从 Excel 公式中删除 FALSE 语句
- azure - 使用全局参数调试数据工厂管道时出错
- amazon-web-services - 防止未经验证的 Aws cognito 使用相同的电话号码注册多个用户
- sql - SQL:有没有办法找到重复项并将它们标记为带有大小写的新列