golang-切片排序、map排序、结构体排序

1,slice(切片)排序

  • 这个直接看就好了
int类型排序
s := []int{3,2,4,1}
sort.Ints(s)
fmt.Println(s)  // [1,2,3,4]

string类型排序
s := []string{"Go", "Bravo", "Gopher", "Alpha", "Grin", "Delta"}
sort.Strings(s)
fmt.Println(s) // [Alpha Bravo Delta Go Gopher Grin]

float类型排序
s := []float64{5.2, -1.3, 0.7, -3.8, 2.6} 
sort.Float64s(s)
fmt.Println(s) // [-3.8,-1.3,0.7,2.6,5.2]

2, 对结构体进行排序

  • 前提:要想对某个类型排序,首先要这个类型实现Swap len less 三个方法,ps:通常只要自己定义Less方法,另外两个不需要动

  • 思路:构建一个类型,同时定义一个切片,以需要排序的类型为element,实现以上三个方法,然后根据业务逻辑对Less函数进行修改定制

      type Person struct {
      	Name string
      	Age int
      }
      
      type byAge []Person
      
      func (a ByAge) Len() int           { return len(a) }
      func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
      func (a ByAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
      
      func main() {
          family := []Person{
              {"Alice", 23},
              {"Eve", 2},
              {"Bob", 25},
          }
          sort.Sort(ByAge(family))
          fmt.Println(family) // [{Eve 2} {Alice 23} {Bob 25}]
      }
    

3,map排序

  • 思路: 要对golang map按照value进行排序,思路是直接不用map,用struct存放key和value,实现sort接口,就可以调用sort.Sort进行排序了
  • sort.Reverse是提供倒序排序
  • 如果需要对key排序,则只需要修改Less函数即可
	type Pair struct {
		Key   string
		Value int
	}
	
    type PairList []Pair

    func (p PairList) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
    func (p PairList) Len() int           { return len(p) }
    func (p PairList) Less(i, j int) bool { return p[i].Value < p[j].Value }
    
    // A function to turn a map into a PairList, then sort and return it.
    func sortMapByValue(m map[string]int) PairList {
    	p := make(PairList, len(m))
    	i := 0
    	for k, v := range m {
    		p[i] = Pair{k, v}
    		i++
    	}
    	sort.Sort(sort.Reverse(p)) // sort.Reverse是提供倒序排序
    	return p
    }

4,sort.Sort函数解析

  • 该包实现了四种基本排序算法:插入排序、归并排序、堆排序和快速排序。 但是这四种排序方法是不公开的,它们只被用于sort包内部使用。所以在对数据集合排序时不必考虑应当选择哪一种排序方法,只要实现了sort.Interface定义的三个方法:获取数据集合长度的Len()方法、比较两个元素大小的Less()方法-平时自定义排序的时主要就是修改这个函数 和交换两个元素位置的Swap()方法,就可以顺利对数据集合进行排序。sort包会根据实际数据自动选择高效的排序算法。

文章参考链接如下:
https://golang.org/pkg/sort/#Reverse
https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter03/03.1.html

你可能感兴趣的:(golang)