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


猜你喜欢
- 一般用 createProcessingInstruction 方法创建处理指令指定参数为 "xml","ve
- 理论介绍分词是自然语言处理的一个基本工作,中文分词和英文不同,字词之间没有空格。中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文
- 在PC端登录公司的后台管理系统或在手机上登录某个APP时,经常会发现登录成功后,返回参数中会包含token,它的值为一段较长的字符串,而后续
- 1、前不久,friendfeed.com把主导航从上面,移到了右侧。现在,又改到了左侧。2、现在,twitter.com把页签(相当于二级导
- 实现方法: 建立一个用户附加表InviteUser_NewUser,结构如下: 然后跟着我的思路走: 用户接这个链接后 =》 进
- subprocess.run()运行并等待args参数指定的指令完成,返回CompletedProcess实例。参数:(*popenargs
- 只能输入中文/** * 22.验证汉字 * 表达式 ^[\u4e00-\u9fa5]{0,}$ * 描述 只能汉字 * 匹配的例子 清清月儿
- 本文实例讲述了MySQL截取和拆分字符串函数用法。分享给大家供大家参考,具体如下:首先说截取字符串函数:SUBSTRING(commenti
- defineComponent函数,只是对setup函数进行封装,返回options的对象;export function defineCo
- 在WEB开发中.我们可能都习惯使用下面的代码来获取客户端的IP地址: C#代码 //优先取得 * string IP = Request
- 启动targetcli时遭遇ImportError: cannot import name ALUATargetPortGrou
- 目录一.models数据库映射二.serializers序列化三.url路由四.Views视图类一.models数据库映射from djan
- 表单在提交前我们通常会用客户端JS对其内容进行验证,通常都是写一个函数然后在onsumbit事件中调用,如下:<html><
- anaconda指的是一个开源的Python
- 什么是接口接口是一种定义规范,规定了对象应该具有哪些方法,但并不指定这些方法的具体实现。在 Go 语言中,接口是由一组方法签名(方法名、参数
- SQL Server有几个版本都在使用中——4.2, 6.0, 6.5, 7.0, 2000,以及2
- 在我们的`` current_datetime`` 视图范例中,尽管内容是动态的,但是URL ( /time/ )是静态的。 在 大多数动态
- 如果你是个学生,你应该会C,C++和Java。还会一些VB,或C#/.NET。多少你还可能开发过一些Web网页,你知道一些HTML,CSS和
- 为什么需要对参数进行编码?相信有过开发的经验的广大程序员都知道,在Web中,若是直接在Url地址上传递参数值,若是中文,或者+等什么的就会出
- 1 abstract验证码作为一种自然人的机器人的判别工具,被广泛的用于各种防止程序做自动化的场景中。传统的字符型验证安全性已经名存实亡的情