📌  相关文章
📜  如何在 Golang 中对整片进行排序?(1)

📅  最后修改于: 2023-12-03 14:52:18.239000             🧑  作者: Mango

在 Golang 中对整片进行排序

在 Golang 中,可以使用内置的 sort 包对整片进行排序。sort 包提供了多种排序函数,其中最常用的是 sort.Slice() 函数和 sort.Sort() 函数。

sort.Slice()

sort.Slice() 函数可以根据给定的比较函数对整片进行排序。比较函数需要满足以下条件:

  • 输入参数为待排序的两个元素,类型为 interface{}
  • 返回值为一个布尔值,表示两个元素的大小关系。如果第一个元素应该排在第二个元素之前,则返回 true,否则返回 false

示例代码:

package main

import (
	"fmt"
	"sort"
)

func main() {
	nums := []int{5, 2, 6, 1, 3, 9, 4, 8, 7}
	sort.Slice(nums, func(i, j int) bool {
		return nums[i] < nums[j]
	})
	fmt.Println(nums)
}

输出结果:

[1 2 3 4 5 6 7 8 9]

在上面的示例中,我们使用了 sort.Slice() 函数和一个匿名函数来指定排序算法。匿名函数的实现是根据元素大小来比较它们的值。

sort.Sort()

sort.Sort() 函数可以对实现了 sort.Interface 接口的任意类型进行排序。sort.Interface 接口包含了以下三个方法:

  • Len():返回整片的长度
  • Swap(i, j int):交换索引为 i 和 j 的两个元素
  • Less(i, j int) bool:判断索引为 i 的元素是否应该排在索引为 j 的元素之前。如果是,则返回 true,否则返回 false

示例代码:

package main

import (
	"fmt"
	"sort"
)

type Person struct {
	Name   string
	Age    int
	Gender string
}

type ByAge []Person

func (a ByAge) Len() int {
	return len(a)
}

func (a ByAge) Swap(i, j int) {
	a[i], a[j] = a[j], a[i]
}

func (a ByAge) Less(i, j int) bool {
	return a[i].Age < a[j].Age
}

func main() {
	people := []Person{
		{"Alice", 25, "Female"},
		{"Bob", 30, "Male"},
		{"Charlie", 20, "Male"},
		{"David", 35, "Male"},
		{"Eva", 25, "Female"},
	}
	sort.Sort(ByAge(people))
	for _, p := range people {
		fmt.Println(p.Name, p.Age, p.Gender)
	}
}

输出结果:

Charlie 20 Male
Alice 25 Female
Eva 25 Female
Bob 30 Male
David 35 Male

在上面的示例中,我们创建了一个 Person 类型,然后创建了另一个 ByAge 类型来对 Person 进行排序。ByAge 实现了 sort.Interface 接口的三个方法,在 main() 函数中使用了 sort.Sort() 函数对 people 进行了排序。最后输出了排序后的结果。

结论

在 Golang 中,使用 sort 包进行排序非常方便,可以通过实现不同的比较函数来实现不同的排序算法。使用 sort.Sort() 函数可以对任意实现了 sort.Interface 接口的类型进行排序。