【golang】sort.Slice实现多条件排序

还是以前的笔记,上传一下

package test

import (
	"fmt"
	"sort"
)

func Test2() {
	Ages := []int{3, 11, 45, 11, 98, 11}
	Names := []string{"huangfeng", "huangfeng", "mycat", "baideng", "fanbingbing", "abc"}
	CityNums := []int{1, 1, 4, 4, 7, 4}
	// 创建测试用的切片
	var Persons []PersonForSort
	for i := range Ages {
		p := PersonForSort{Age: Ages[i], Name: Names[i], CityNum: CityNums[i]}
		Persons = append(Persons, p)
	}
	fmt.Println("原生切片 ", Persons)
	//开始排序逐步添加至三个排序条件
	var PersonCopy1 = make([]PersonForSort, len(Persons))
	var PersonCopy2 = make([]PersonForSort, len(Persons))
	copy(PersonCopy1, Persons)
	copy(PersonCopy2, Persons)
	// 条件一:年龄升
	// 我们使用的是sort.Slice方法实现自定义排序规则
	sort.Slice(Persons, func(i, j int) bool {
		return Persons[i].Age < Persons[j].Age
	})
	// 查看第一次排序的结果
	fmt.Println("条件一的结果 ", Persons)

	// 条件二:年龄升序,年龄相同则按照城市代码降序
	sort.Slice(PersonCopy1, func(i, j int) bool {
		return PersonCopy1[i].Age < PersonCopy1[j].Age || (PersonCopy1[i].Age == PersonCopy1[j].Age && PersonCopy1[i].CityNum > PersonCopy1[j].CityNum)
	})
	// 查看第二次排序的结果
	fmt.Println("条件二的结果 ", PersonCopy1)

	// 条件三:年龄升序,相同则按照城市代码降序,再相同则按照名字字典序升序
	sort.Slice(PersonCopy2, func(i, j int) bool {
		return PersonCopy2[i].Age < PersonCopy2[j].Age ||
			PersonCopy2[i].Age == PersonCopy2[j].Age && PersonCopy2[i].CityNum > PersonCopy2[j].CityNum ||
			PersonCopy2[i].Age == PersonCopy2[j].Age && PersonCopy2[i].CityNum == PersonCopy2[j].CityNum && PersonCopy2[i].Name < PersonCopy2[j].Name
	})
	// 查看第二次排序的结果
	fmt.Println("条件三的结果 ", PersonCopy2)

}

// 创建一些用于排序的机构体
type PersonForSort struct {
	Age     int
	Name    string
	CityNum int
}

// 原生切片  [{3 huangfeng 1} {11 huangfeng 1} {45 mycat 4} {11 baideng 4} {98 fanbingbing 7} {11 abc 4}]
// 条件一的结果  [{3 huangfeng 1} {11 huangfeng 1} {11 baideng 4} {11 abc 4} {45 mycat 4} {98 fanbingbing 7}]
// 条件二的结果  [{3 huangfeng 1} {11 baideng 4} {11 abc 4} {11 huangfeng 1} {45 mycat 4} {98 fanbingbing 7}]
// 条件三的结果  [{3 huangfeng 1} {11 abc 4} {11 baideng 4} {11 huangfeng 1} {45 mycat 4} {98 fanbingbing 7}]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值