sort排序

sort排序

对象内排序

//age升序排列
sort.Slice(list, func(i, j int) bool {
		return list[i].age< list[j].age
	})

//age降序排列
sort.Slice(list, func(i, j int) bool {
		return list[i].age> list[j].age
	})

//age升序,num降序
sort.Slice(list, func(i, j int) bool {
		if list[i].age == list[j].age {
			return list[i].num > list[j].num
		}
		return list[i].age < list[j].age
	})

字符串排序

方式一:
func reverse(str string) string {
    var result string
    strLen := len(str)
    for i := 0; i < strLen; i++ {
        result = result + fmt.Sprintf("%c", str[strLen-i-1])
    }
    return result
}

方式二:
func reverse2(str string) string {
    var result []byte
    tmp := []byte(str)
    length := len(str)
    for i := 0; i < length; i++ {
        result = append(result, tmp[length-i-1])
    }
    return string(result)
}

方式三:
func reverse13(s string) string {
	runes := []rune(s)
	for from, to := 0, len(runes)-1; from < to; from, to = from+1, to-1 {
		runes[from], runes[to] = runes[to], runes[from]
	}
	return string(runes)
}

切片排序

r := []int{5,2,6,10,3} // []int{}
sort.Ints(r)  // 升序
sort.Sort(sort.IntSlice(r)) //升序
fmt.Println(r) // [2 3 5 6 10]


a := []float64{5.5, 2.2, 6.6, 3.3, 1.1, 4.4}
sort.Float64s(a) // 升序
sort.Sort(sort.Float64Slice(a)) // 升序
fmt.Println(a) // [1.1 2.2 3.3 4.4 5.5 6.6]


s := []string{"PHP", "golang", "python", "C", "Objective-C"}
sort.Strings(s) // 字母开头升序
sort.Sort(sort.StringSlice(s)) //字母开头升序
fmt.Println(s) // [C Objective-C PHP golang python]

逆序:
func reverse(s []int) []int {
	for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
		s[i], s[j] = s[j], s[i]
	}
	return s
}
func main() {
	r := []int{5,2,6,10,3}
	k:=reverse(r) // 逆序
	fmt.Println(k) // [3 10 6 2 5]

	sort.Ints(r)  // 升序
	fmt.Println(r) // [2 3 5 6 10]

	k2:=reverse(r) // 逆序
	fmt.Println(k2) // [10 6 5 3 2]
}

自定义排序

type User struct {
	name string
	age  int
	num  int
}
type SortByUsers struct {
	users
}
type users []*User

func (M users) Len() int {
	return len(M)
}
func (M users) Swap(i, j int) {
	M[i], M[j] = M[j], M[i]
}

//按age升序,num降序排
func (S SortByUsers) Less(i, j int) bool {
	if S.users[i].age == S.users[j].age {
		return S.users[i].num > S.users[j].num
	}
	return S.users[i].age < S.users[j].age // 按照 距离 升序排序
}
func main() {
list := []*User{
		{name: "a", age: 1, num: 1},
		{name: "a", age: 1, num: 10},
		{name: "b", age: 3, num: 2},
		{name: "b", age: 2, num: 2},
		{name: "b", age: 4, num: 2},
	}
	sort.Sort(SortByUsers{list})
	for _, v := range list {
		fmt.Println(*v)
	}
}



posted @ Jeff的技术栈 阅读 (9999+) 评论 (99) 点赞(99) 编辑 MD 收藏
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
回顶部
点击右上角即可分享
微信分享提示