zoukankan      html  css  js  c++  java
  • go切片排序

    前言

    有时候我们需要根据切片中的某个字段进行切片排序,但sort包中只有默认基本类型 intfloat64string 的排序,所以我们可以手动实现sort包的 sort.Interface 接口,来完成自定义排序。这个接口有三个方法 Len()Less(i,j)Swap(i,j)

    切片排序

    package main
    
    import (
    	"fmt"
    	"sort"
    )
    
    type Person struct {
    	Name      string // 姓名
    	Age       int    // 年龄
    	CreatedAt int64  // 记录时间
    }
    
    // 按照 Person.Age 从大到小排序
    type PersonSlice []Person
    
    // 重写 Len() 方法
    func (p PersonSlice) Len() int {
    	return len(p)
    }
    
    // 重写 Swap() 方法
    func (p PersonSlice) Swap(i, j int) {
    	p[i], p[j] = p[j], p[i]
    }
    
    // 重写 Less() 方法
    // 使用不同字段进行对比,并依此排序,这里用了Age,可以更换成CreatedAt进行排序的
    // 使用 < 从大到小排序,使用 > 从小到大排序
    func (p PersonSlice) Less(i, j int) bool {
    	return p[j].Age < p[i].Age
    }
    
    func main() {
    	people1 := Person{
    		Name:      "牛奔1",
    		Age:       18,
    		CreatedAt: 1618667000,
    	}
    	people2 := Person{
    		Name:      "牛奔2",
    		Age:       19,
    		CreatedAt: 1618667100,
    	}
    	people3 := Person{
    		Name:      "牛奔3",
    		Age:       20,
    		CreatedAt: 1618667200,
    	}
    
    	peopleSlice := PersonSlice{}
    	peopleSlice = append(peopleSlice, people2, people1, people3)
    
    	fmt.Println(peopleSlice)
    
    	sort.Sort(PersonSlice(peopleSlice)) // 按照Age的逆序排序
    	fmt.Println(peopleSlice)
    
    	sort.Sort(sort.Reverse(PersonSlice(peopleSlice))) // 按照Age的升序排序
    	fmt.Println(peopleSlice)
    }
    

    输出:

    [{牛奔2 19 1618667100} {牛奔1 18 1618667000} {牛奔3 20 1618667200}]
    [{牛奔3 20 1618667200} {牛奔2 19 1618667100} {牛奔1 18 1618667000}]
    [{牛奔1 18 1618667000} {牛奔2 19 1618667100} {牛奔3 20 1618667200}]
    

    看到结果已经根据年龄字段排序啦

  • 相关阅读:
    AOP AspectJ 字节码 语法 MD
    判断小米华为等系统 MD
    vuejs2.0实现分页组件,使用$emit进行事件监听数据传递
    vuejs2.0实现一个简单的分页
    vuejs2.0使用Sortable.js实现的拖拽功能
    JavaScript之Number、String、Array常用属性与方法手册
    CSS3效果:5种预载动画效果
    vuejs 1.x
    window.requestAnimationFrame与Tween.js配合使用实现动画缓动效果
    如何用JavaScript判断dom是否有存在某class的值?
  • 原文地址:https://www.cnblogs.com/niuben/p/14672265.html
Copyright © 2011-2022 走看看