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}]
    

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

  • 相关阅读:
    在java中使用ffmpeg将amr格式的语音转为mp3格式
    keras实现不同形态的模型
    TF版本的Word2Vec和余弦相似度的计算
    TensorFlow中的两种conv2d方法和kernel_initializer
    CNN中的padding
    记一次sqoop同步到mysql
    理解HDFS
    TensorFlow中的优化算法
    使用TensorFlow实现分类
    使用TensorFlow实现回归预测
  • 原文地址:https://www.cnblogs.com/niuben/p/14672265.html
Copyright © 2011-2022 走看看