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]

Original: https://www.cnblogs.com/notomatoes/p/16277688.html
Author: Notomato
Title: Go sort包

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516303/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Go语言学习笔记-结构体(Struct)

    Go语言结构体 1、概念结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不…

    Go语言 2023年5月25日
    058
  • 这不会又是一个Go的BUG吧?

    hello,大家好呀,我是小楼。 最近我又双叒叕写了个BUG,一个线上服务死锁了,不过幸亏是个新服务,没有什么大影响。 出问题的是Go的读写锁,如果你是写Java的,不必划走,更要…

    Go语言 2023年5月25日
    074
  • 系统调用跟踪——分析(一)

    通过strace工具可跟踪用户进程与Linux内核的调用交互,可看到其中的System Call(系统调用)情况; &#x5B89;&#x88C5;strace&a…

    Go语言 2023年5月25日
    092
  • Go语言之反射

    一、反射的基本概念 (一)什么是反射 反射可以再运行时动态获取变量的各种信息,比如变量的类型、值等 如果时结构体变量,还可以获取到结构体本身的各种信息,比如结构体的字段、方法 通过…

    Go语言 2023年5月29日
    076
  • 对不起,我错了,这代码不好写

    hello,大家好呀,我是小楼。 前几天不是写了这篇文章《发现一个开源项目优化点,点进来就是你的了》嘛。 文章介绍了Sentinl的自适应缓存时间戳算法,从原理到实现都手把手解读了…

    Go语言 2023年5月25日
    067
  • Go语言中单个字符char rune

    Go 语言的字符使用UTF-8 编码 *英文字母 1&#x4E2A; 字节, 汉子 3&#x4E2A; 字节 golang的字符称为rune,等价于C中的char,…

    Go语言 2023年5月29日
    054
  • Go语言之变量与基础数据类型

    Go 是静态(编译型)语言,是区别于解释型语言的弱类型语言(静态:类型固定,强类型:不同类型不允许直接运算) 例如 python 就是动态强类型语言 1、Go 的特性: 跨平台的编…

    Go语言 2023年5月25日
    055
  • go入门项目:(1) 基于命令行的图书的增删查改

    Go 语言入门练手项目系列 01 基于命令行的图书的增删查改 02 文件管理 持续更新中… 本文来自博客园,作者:Arway,转载请注明原文链接:https://www…

    Go语言 2023年5月25日
    065
  • 十分钟学会Golang开发gRPC服务

    gRPC是Google发起的一个开源RPC框架,使用HTTP/2传输协议,使用Protocol Buffers编码协议,相比RESTful框架的程序性能提高不少,而且当前流行的编程…

    Go语言 2023年5月25日
    074
  • go语言面向对象编程之类型系统

    go语言类型系统 类型系统,顾名思义是指一个语言的类型体系结构,一个典型的类型系统通常包含如下基本内容 基础类型:如byte,int,bool,float等 复合类型:如数组,指针…

    Go语言 2023年5月29日
    042
  • DDIA 学习笔记

    第一章 可靠性、可扩展性、可维护性 ​ 可靠性: 系统在 困境(adversity)(硬件故障、软件故障、人为错误)中仍可正常工作(正确完成功能,并能达到期望的性能水准。 ​ 可靠…

    Go语言 2023年5月25日
    077
  • 基于LSM的Key-Value数据库实现初篇

    前篇文章对LSM的基本原理,算法流程做了简单的介绍,这篇文章将实现一个简单的 基于LSM算法的 迷你Key-Value数据库,结合上篇文章的理论与本篇文章的实践使之对LSM算法有更…

    Go语言 2023年5月25日
    071
  • 因势而变,因时而动,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang泛型(generic)的使用EP15

    事实上,泛型才是Go lang1.18最具特色的所在,但为什么我们一定要拖到后面才去探讨泛型?类比的话,我们可以想象一下给小学一年级的学生讲王勃的千古名篇《滕王阁序》,小学生有多大…

    Go语言 2023年5月25日
    042
  • 惨,给Go提的代码被批麻了

    hello大家好,我是小楼。 不知道大家还记不记得我上次找到了一个Go的Benchmark执行会超时的Bug?就是这篇文章《我好像发现了一个Go的Bug?》。 之后我就向Go提交了…

    Go语言 2023年5月25日
    079
  • Go语言之Goroutine与信道、异常处理

    一、Goroutine Go 协程可以看做成一个轻量级的线程,Go 协程相比于线程的优势: Goroutine 的成本更低大小只有 2 kb 左右,线程有几个兆。 Goroutin…

    Go语言 2023年5月25日
    061
  • croncli 定时器命令(golang)

    定时器是执行任务时的常用功能,配置系统的定时任务太麻烦,所以就想用golang简单实现一个定时器命令。 定时器的参数包括: $ croncli -h 定时器命令 Usage: cr…

    Go语言 2023年5月25日
    055
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球