本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
Golang 语言怎么高效排序数据?
沙雕mars · 234浏览 · 发布于2021-11-09 +关注

本文我们介绍了怎么使用 Golang 语言标准库 sort 包排序数据,需要注意的是,除了本文使用的类型之外,其它任意类型只要实现 sort.Interface 的三个方法,都可以调用 sort.Sort() 函数排序数据。

01介绍

在 Golang 语言项目开发中,经常会遇到数据排序问题。Golang 语言标准库 sort 包,为我们提供了数据排序的功能,我们可以直接使用 sort.Sort() 函数进行数据排序,sort.Sort() 函数底层实现是以快排为主,并根据目标数据的具体情况选择不同的排序算法。本文我们介绍 sort 包排序数据的使用方法。

02切片排序

在 Golang 语言标准库 sort 包中,sort.Sort() 函数用于数据排序,该函数需要一个 interface 类型的入参 sort.Interface,它包含三个方法,分别是 Len(),Less() 和 Swap()。也就是说,如果我们需要使用 sort 包的 Sort 函数进行数据排序,首先入参的数据需要实现这三个方法,或者理解为任意元素类型的切片实现了这三个方法,都可以使用 sort.Sort() 函数排序数据。

sort 包代码:

type Interface interface { 
 Len() int // 集合中元素的数量 
 Less(i, j int) bool // 描述元素的顺序 
 Swap(i, j int) // 交换索引为 i 和 j 的元素 
} 

func Sort(data Interface)

    需要注意的是 sort.Sort() 函数不能保证数据排序是稳定的,如果需要保证数据排序稳定,可以使用 sort.Stable() 函数,“稳定”的含义是原始数据中 a 和 b 的值相等,排序前 a 排在 b 的前面,排序后 a 仍排在 b 的前面。

    为了方便读者朋友们理解,我们使用 int 类型的切片作为示例,介绍 sort.Sort() 函数的使用方法,我们定义一个类型 type IntSlice []int,并且给类型 IntSlice 实现 sort.Interface 接口类型定义的三个方法,然后使用 sort.Sort() 函数排序数据。

    示例代码:

    package main 
    
    import ( 
     "fmt" 
     "sort" 
    ) 
    
    type IntSlice []int 
    
    func (s IntSlice) Len() int { 
     return len(s) 
    } 
    
    func (s IntSlice) Less(i, j int) bool { 
     return s[i] > s[j] 
    } 
    
    func (s IntSlice) Swap(i, j int) { 
     s[i], s[j] = s[j], s[i] 
    } 
    
    func main () { 
     intSlice := IntSlice([]int{1, 3, 5, 7, 9}) 
     fmt.Println(intSlice) // 排序前 
     sort.Sort(intSlice) 
     fmt.Println(intSlice) // 排序后 
    }

      输出结构:

      [9 7 5 3 1] 
      
      [1 3 5 7 9]

        读到这里,我相信聪明的读者朋友们已经了解了 sort.Sort() 的使用方式,同时也会产生一个疑问,难道每次使用 sort.Sort() 排序数据,都需要这么麻烦吗?我还不如自己写个遍历排序数据。

        是的,当然不用这么麻烦,sort 包已经帮我们封装好了常用函数,我们直接使用就可以了。所以,上面的示例代码可以使用 sort.Ints() 函数排序数据。

        示例代码:

        func main () { 
         intSlice := IntSlice([]int{9, 7, 5, 3, 1}) 
         fmt.Println(intSlice) // 排序前 
         sort.Ints(intSlice) 
         fmt.Println(intSlice) // 使用 sort.Ints() 排序数据 
        }

          除了 sort.Ints(),还有 sort.Float64s(),sort.Strings()等。

          03自定义集合排序

          在 Golang 语言项目开发中,我们经常会使用结构体,如果我们需要排序结构体类型的切片,应该怎么操作呢?

          我们可以按照 Part 01 介绍的方式,实现那三个方法,然后调用 sort.Sort() 函数,当然,sort 包也为我们封装了排序结构体类型切片的函数 sort.Slice(),但是,参数除了需要排序的数据之外,还需要提供一个 Less() 函数类型的参数。

          示例代码:

          people := []struct { 
            Name string 
            Age  int 
           }{ 
            {"Gopher", 7}, 
            {"Alice", 55}, 
            {"Vera", 24}, 
            {"Bob", 75}, 
           } 
           sort.Slice(people, func(i, j int) bool { return people[i].Name < people[j].Name }) 
           fmt.Println("By name:", people) 
          
           sort.Slice(people, func(i, j int) bool { return people[i].Age < people[j].Age }) 
           fmt.Println("By age:", people)

            输出结果:

            By name: [{Alice 55} {Bob 75} {Gopher 7} {Vera 24}] 
            
            By age: [{Gopher 7} {Vera 24} {Alice 55} {Bob 75}]

              04总结

              本文我们介绍了怎么使用 Golang 语言标准库 sort 包排序数据,需要注意的是,除了本文使用的类型之外,其它任意类型只要实现 sort.Interface 的三个方法,都可以调用 sort.Sort() 函数排序数据。

              另外,除了排序数据之外,sort 包也为我们提供了查找功能的函数 sort.Search(),感兴趣的读者朋友们可以阅读 Golang 语言官方标准库文档了解更多。


              相关推荐

              PHP实现部分字符隐藏

              沙雕mars · 1323浏览 · 2019-04-28 09:47:56
              Java中ArrayList和LinkedList区别

              kenrry1992 · 906浏览 · 2019-05-08 21:14:54
              Tomcat 下载及安装配置

              manongba · 966浏览 · 2019-05-13 21:03:56
              JAVA变量介绍

              manongba · 960浏览 · 2019-05-13 21:05:52
              什么是SpringBoot

              iamitnan · 1084浏览 · 2019-05-14 22:20:36
              加载中

              0评论

              评论
              做自己,让别人去说,欢迎各位关注!
              分类专栏
              小鸟云服务器
              扫码进入手机网页