go 排序 接口排序

文章介绍了Go语言标准库中的sort包,展示了如何对基本类型切片(如int,float64,string)进行排序,以及如何对任意类型切片和自定义数据结构进行排序。通过sort.Slice实现任意类型切片排序,而自定义数据结构需要实现sort.Interface接口来完成排序。示例代码涵盖了结构体排序和稳定排序的用法。
摘要由CSDN通过智能技术生成

Go sort 包主要提供了三种排序能力:
(1)基本类型切片排序;
(2)任意类型切片排序 ;
(3)任意数据结构排序 (实现接口方法排序)

一、基本类型切片排序

为了便于对常用数据类型的操作,sort 包提供了对 []int切片、[]float64切片 和 []string 切片的排序支持。 切片排序

sort.Ints(sli)
sort.Float64s(sli1)
sort.Strings(sli2)

实现

package main

import (
	"fmt"
	"sort"
)
func main() {
	sli := []int{6, 568, 566, 484, 55}
	sort.Ints(sli)
	fmt.Printf("sli: %v\n", sli)

	sli1 := []float64{6.62, 568.54, 25.566, 484.2, 55.2}
	sort.Float64s(sli1)
	fmt.Printf("sli1: %v\n", sli1)

	sli2 := []string{"aa", "bb", "AA"}
	sort.Strings(sli2)
	fmt.Printf("sli2: %v\n", sli2)
}

二、任意类型的切片排序(如,结构体)

包内代码

func Slice(x any, less func(i, j int) bool) {
	rv := reflectlite.ValueOf(x)
	swap := reflectlite.Swapper(x)
	length := rv.Len()
	limit := bits.Len(uint(length))
	pdqsort_func(lessSwap{less, swap}, 0, length, limit)
}

实现

package main

import (
	"fmt"
	"sort"
)

type student struct {
	name string
	age  int
	hav  int
}

func main() {

	//二、任意类型切片排序(如,结构体)
	a := student{"aa", 32, 120}
	b := student{"bb", 65, 100}
	c := student{"cc", 54, 130}
	d := student{"dd", 814, 62}

	fmt.Println(a, b, c, d)
	ss := []student{
		a, b, c, d,
	}

	sort.Slice(ss, func(i, j int) bool { //切片比较  排序
		return ss[i].age < ss[j].age
	})

	for _, v := range ss { //按行打印
		fmt.Printf("v: %v\n", v)
	}

}

三、任意数据结构排序 (实现接口方法排序)

包内代码

type Interface interface {
	Len() int
	Less(i, j int) bool
	Swap(i, j int)
}
type StringSlice []string
func (x StringSlice) Len() int           { return len(x) }
func (x StringSlice) Less(i, j int) bool { return x[i] < x[j] }
func (x StringSlice) Swap(i, j int)      { x[i], x[j] = x[j], x[i] }

func Sort(data Interface) {
	n := data.Len()
	if n <= 1 {
		return
	}
	limit := bits.Len(uint(n))
	pdqsort(data, 0, n, limit)
}
func Stable(data Interface) {
	stable(data, data.Len())
}

实现

package main

import (
	"fmt"
	"sort"
)

type person struct {
	name   string
	age    int
	height int
}
type stringperson []person

//实现sort.Interface 接口方法

func (x stringperson) Len() int { return len(x) }
func (x stringperson) Less(i, j int) bool {
	if x[i].age > x[j].age { //先以年龄作比较
		return true
	}
	return x[i].height > x[j].height //年龄一样的,再比身高

}
func (x stringperson) Swap(i, j int) { x[i], x[j] = x[j], x[i] }

func main() {
	sperson := []person{ //person结构类型的切片
		{"aa", 3, 54},
		{"aa", 2, 54},
		{"aa", 6, 54},
		{"aa", 3, 52},
		{"aa", 12, 15},
	}
	sort.Stable(stringperson(sperson))
	// sort.Sort(stringperson(sperson))
	fmt.Printf("sperson: %v\n", sperson)
}

//返回
//sperson: [{aa 12 15} {aa 6 54} {aa 3 54} {aa 3 52} {aa 2 54}]

-----------end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值