Go语言sort包函数使用示例
作者:Notomato 发布时间:2023-10-15 03:29:59
标签:Go语言,sort,包,函数
sort包简介
官方文档Golang的sort包用来排序,二分查找等操作。本文主要介绍sort包里常用的函数,通过实例代码来快速学会使用sort包
sort包内置函数
sort.Ints(x []int)
ints := []int{1, 4, 3, 2}
fmt.Printf("%v\n", ints)
sort.Ints(ints) //默认升序
fmt.Printf("%v\n", ints) //[1 2 3 4]
sort.Sort(sort.Reverse(sort.IntSlice(ints))) //降序排序
fmt.Printf("%v\n", ints) //[4 3 2 1]
sort.Strings(x []string)
sort.Float64s(x []float64)
使用方法同上,都是对内置int string float64类型的便捷排序
sort.Slice(x any, less func(i, j int) bool)
传入对象是切片,要自己实现回调函数
slices := []int{1, 1, 4, 5, 1, 4}
sort.Slice(slices, func(i, j int) bool {
return slices[i] < slices[j]
})
fmt.Printf("%v\n", slices)//[1 1 1 4 4 5]
同时也可以对结构体自定义排序规则
type stu struct {
name string
age int
}
stus := []stu{{"h", 20}, {"a", 23}, {"h", 21}}
sort.Slice(stus, func(i, j int) bool {
if stus[i].name == stus[j].name {
return stus[i].age > stus[j].age // 年龄逆序
}
return stus[i].name < stus[j].name // 名字正序
})
fmt.Printf("%v\n", stus) //[{a 23} {h 21} {h 20}]
sort.Sort(data Interface)
自定义排序,需要实现 Len() Less() Swap() 三个方法
type Interface interface {
// Len is the number of elements in the collection.
Len() int
// Less reports whether the element with
// index i should sort before the element with index j.
Less(i, j int) bool
// Swap swaps the elements with indexes i and j.
Swap(i, j int)
}
使用代码
type stu struct {
name string
age int
}
type student []stu
func (s student) Len() int {
return len(s)
}
func (s student) Less(i, j int) bool {
if s[i].name == s[j].name {
return s[i].age > s[j].age // 年龄逆序
}
return s[i].name < s[j].name // 名字正序
}
func (s student) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
func main() {
stus1 := student{{"h", 20}, {"a", 23}, {"h", 21}}
sort.Sort(stus1)
fmt.Printf("%v\n", stus1) //[{a 23} {h 21} {h 20}] 使用效果等同于sort.Slice
}
使用效果等同于sort.Slice后者代码量较少
sort.SearchInts(a []int, x int) int
该函数是用来二分查找的, 默认是在左边插入
arr := []int{1, 2, 3, 4, 5, 6, 7}
idx := sort.SearchInts(arr, 4)
fmt.Printf("%v\n", idx) // 3
sort.SearchFloat64s(a []float64, x float64) int
sort.SearchStrings(a []string, x string) int
这两函数功能同上
sort.Search(n int, f func(int) bool) int
自定义的二分查找,回调函数需要自己实现查找条件
arr := []int{1, 2, 3, 4, 5, 6, 7}
idx := sort.Search(len(arr), func(i int) bool {
return arr[i] > 4
})
fmt.Printf("%v\n", idx) //4
相比SearchInts,通过自定义条件便实现了相等情况下在右边插入,前者默认是在左边
更高级一点的用法
mysring := []string{"abcd", "bcde", "bfag", "cddd"}
idx := sort.Search(len(mysring), func(i int) bool {
// 查找头两位字母不是b的,,返回找到的第一个
return mysring[i][0] != 'b' && mysring[i][1] != 'b'
})
fmt.Printf("%v\n", mysring[idx]) // cddd
mysring := []string{"abcd", "bcde", "bfag", "cddd"}
idx := sort.Search(len(mysring), func(i int) bool {
//查找第一个字母不是b的
return mysring[i][0] <= byte('b')
})
fmt.Printf("%v\n", mysring[idx]) // abcd
来源:https://www.cnblogs.com/notomatoes/p/16277688.html
0
投稿
猜你喜欢
- ORACLE访问SQL SERVER数据库有一篇《Oracle 异构服务实践》讲得很清楚。但里面没有讲如何设置访问多个SQL Server数
- 在windows+iis服务器上运行asp程序可能会出现数据库无法更新的情况,具体错误信息可能为: 1、Microsoft JET Data
- 引言最近研究Go爬虫相关的知识,使用到goquery这个库比较多,尤其是对爬取到的HTML进行选择和查找匹配的内容时,goquery的选择器
- Pattern.split方法详解/** * 测试Pattern.split方法 */ @Test public void testPatt
- rss的优点 1.您可以有选择地浏览您感兴趣的以及与您的工作相关的新闻。 2.您可以把需要的信息从不需要的信息(兜售信息,垃圾邮件等)中分离
- 虽然大多数web文档的顶部都有doctype声明,但很多人都没有注意它。它是在你新建一个文档时,由web创作软件草率处理的众多细节之一。虽然
- 前面也讲过一次phar文件上传的东西,但是那都是过滤比较低,仅仅过滤了后缀。知道今天看到了一篇好的文章如果过滤了phar这个伪造协议的话,那
- 在进行数据库的查询时,会经常遇到这样的情况:例如想在一个用户数据库中查询他的用户名和他的密码,但恰好该用户使用的名字和密码中有特殊的字符,例
- 防止客户机的请求互相干扰或者服务器与维护程序相互干扰的方法主要有多种。如果你关闭数据库,就可以保证服务器和myisamchk和isamchk
- 在学习OpenCV或者其他关于Python技术的时候,我们通常需要准备不同的Python环境,我选择了Anaconda作为我的Python环
- 目前,保护数据免受未授权用户的侵犯是系统管理员特别关心的问题。如果你现在用的是MySQL,就可以使用一些方便的功能来保护系统,来大大减少机密
- 目前可实现:MD5算法、SHA256算法、先MD5后SHA256、先SHA256后MD5、两次MD5、两次SHA256、前8位MD5算法后8
- rs.open语句详细说明rs.Open [第一个参数],  
- 代码如下: <% Dim oConn, ors, aRows Dim i,j Set oConn=Server.CreateObjec
- PHP PDO 预处理语句与存储过程很多更成熟的数据库都支持预处理语句的概念。什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译
- 方法不是主流的。有一组数据,大概10万个左右,每一单位的值不会大于30000,要求按照由大到小的顺序不重复输出。参考无忧cosin的方法后(
- 在主图中背景颜色不知道怎么改,plt.plot()中没有axisbg参数。但是子图可以对plt.subplot的参数做修改,下面是对子图的背
- 看代码: HTML: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transi
- 影响 JavaScript性能的另外一个杀手就是递归,在上一节中提到采用memoization技术可以优化计算数值的递归函数,但memoiz
- 打开在节点中加入一句:max_allowed_packet=5M 将MySQL的容量扩大到5M