Golang中字符串、数组、切片排序
原文链接:http://www.zhoubotong.site/post/44.html
使用Golang的sort包用来排序,包括二分查找等操作。下面通过实例代码来分享下sort包的使用技巧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | package main import ( "fmt" "sort" ) func main() { ints := []int{11, 44, 33, 22} sort.Ints(ints) //默认升序 fmt.Printf( "%v\n" , ints) //[11 22 33 44] sort.Sort(sort.Reverse(sort.IntSlice(ints))) //降序排序 fmt.Printf( "%v\n" , ints) //[44 33 22 11] //demo-1:使用字符串排序 //sort.Strings(x []string) sort.Float64s(x []float64) //使用方法同上,都是对内置int string float64类型的便捷排序 str := []string{ "apple" , "lemen" , "banana" , "fruit" } sort.Strings(str) fmt.Printf( "%v\n" , str) //默认升序 sort.Sort(sort.Reverse(sort.StringSlice(str))) //降序排序 fmt.Printf( "%v\n" , str) //demo-2:使用切片排序,传入对象是切片,要自己实现回调函数 slices := []int{11, 11, 44, 55, 11, 44} sort.Slice(slices, func (i, j int) bool { //return slices[i] < slices[j] //升序 即前面的值比后面的小 return slices[i] > slices[j] //降序 即前面的值比后面的大 }) fmt.Printf( "%v\n" , slices) //[55 44 44 11 11 11] //demo-3:对结构体自定义排序规则 type student struct { name string age int } s := []student{{ "babala" , 52}, { "anly" , 50}, { "babala" , 51}} sort.Slice(s, func (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 // 名字升序 }) fmt.Printf( "%v\n" , s) //[{anly 50} {babala 52} {babala 51}] } |
使用接口排序:
sort.Sort(data Interface)
-
自定义排序,需要实现
Len() Less() Swap()
三个方法123456789type
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)
}
完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package main import ( "fmt" "sort" ) 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() { s1 := student{{ "babala" , 52}, { "anly" , 50}, { "babala" , 51}} sort.Sort(s1) fmt.Printf( "%v\n" , s1) //[{anly 50} {babala 52} {babala 51}]使用效果等同于sort.Slice } |
上面可以看到,使用效果等同于sort.Slice,只是后者代码量较少。
sort.SearchInts(a []int, x int) int
-
该函数是用来二分查找的, 默认是在左边插入
123456789101112package
main
import
(
"fmt"
"sort"
)
func
main() {
arr := []int{11, 22, 33, 44, 55, 66, 77}
idx := sort.SearchInts(arr, 44)
// 查找44所在的索引位置,默认0开始
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
-
自定义的二分查找,回调函数需要自己实现查找条件
1234567891011121314package
main
import
(
"fmt"
"sort"
)
func
main() {
arr := []int{11, 22, 33, 44, 55, 66, 77}
idx := sort.Search(len(arr),
func
(i int) bool {
return
arr[i] > 44
//查找 >44的值得索引位置即第一个满足条件的55所在的索引
})
fmt.Printf(
"%v\n"
, idx)
//55 索引位置为4
}
-
相比
SearchInts
,通过自定义条件便实现了相等情况下在右边插入,前者默认是在左边 -
更高级一点的用法
123456789101112131415package
main
import
(
"fmt"
"sort"
)
func
main() {
mysring := []string{
"abcd"
,
"bcde"
,
"cdef"
,
"dbac"
}
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])
// cdef
}
以上就介绍这么多了。感兴趣的朋友欢迎留言补充哈。
-
无论从事什么行业,只要做好两件事就够了,一个是你的专业、一个是你的人品,专业决定了你的存在,人品决定了你的人脉,剩下的就是坚持,用善良專業和真诚赢取更多的信任。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南