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 @ 2023-10-06 22:22  Jeff的技术栈  阅读(25)  评论(0)    收藏  举报
回顶部