Go语言sort包函数使用示例

2022-06-02 17:52:21
目录
sort包简介sort包内置函数sort.Ints(x []int)sort.Slice(x any, less func(i, j int) bool)sort.Sort(data Interface)sort.SearchInts(a []int, x int) intsort.Search(n int, f func(int) bool) int

sort包简介

官方文档Golang的sort包用来排序,二分查找等操作。本文主要介绍sort包里常用的函数,通过实例代码来快速学会使用sort包

sort包内置函数

sort.Ints(x>
	ints := []int{1, 4, 3, 2}
	fmt.Printf("%vn", ints) 
	sort.Ints(ints) //默认升序
	fmt.Printf("%vn", ints) //[1 2 3 4] 
	sort.Sort(sort.Reverse(sort.IntSlice(ints))) //降序排序 
	fmt.Printf("%vn", ints) //[4 3 2 1]

sort.Strings(x []string)

sort.Float64s(x []float64)

    使用方法同上,都是对内置int string float64类型的便捷排序

    sort.Slice(x>
      传入对象是切片,要自己实现回调函数
      	slices := []int{1, 1, 4, 5, 1, 4}
      	sort.Slice(slices, func(i, j int) bool {
      		return slices[i] < slices[j]
      	})
      	fmt.Printf("%vn", 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("%vn", stus) //[{a 23} {h 21} {h 20}]
        

        sort.Sort(data>
          自定义排序,需要实现 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("%vn", stus1) //[{a 23} {h 21} {h 20}] 使用效果等同于sort.Slice
            }
            
              使用效果等同于sort.Slice后者代码量较少

              sort.SearchInts(a>
                该函数是用来二分查找的, 默认是在左边插入
                	arr := []int{1, 2, 3, 4, 5, 6, 7}
                	idx := sort.SearchInts(arr, 4)
                	fmt.Printf("%vn", idx) // 3
                

                sort.SearchFloat64s(a []float64, x float64) int

                sort.SearchStrings(a []string, x string) int

                  这两函数功能同上

                  sort.Search(n>
                    自定义的二分查找,回调函数需要自己实现查找条件
                    	arr := []int{1, 2, 3, 4, 5, 6, 7}
                    	idx := sort.Search(len(arr), func(i int) bool {
                    		return arr[i] > 4
                    	})
                    	fmt.Printf("%vn", 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("%vn", 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("%vn", mysring[idx]) // abcd

                      以上就是Go语言sort包使用示例的详细内容,更多关于Go语言sort包的资料请关注易采站长站其它相关文章!