当前位置: 首页 > news >正文

golang中使用 sort.Interface 实现复杂多级排序

举两个例子,说明 sort.Interface实现多级排序。

例子 1

学生成绩排序(先按成绩降序,成绩相同按姓名升序)

package main import ( "fmt" "sort" ) type Student struct { Name string Score int } type ByScoreAndName []Student func (s ByScoreAndName) Len() int { return len(s) } func (s ByScoreAndName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func (s ByScoreAndName) Less(i, j int) bool { // 第一级:按分数降序(分数高的排前面) if s[i].Score != s[j].Score { return s[i].Score > s[j].Score } // 第二级:分数相同时,按姓名升序 return s[i].Name < s[j].Name } func main() { students := []Student{ {"Alice", 85}, {"Bob", 90}, {"Charlie", 85}, {"David", 90}, } sort.Sort(ByScoreAndName(students)) for _, s := range students { fmt.Printf("%s: %d\n", s.Name, s.Score) } // 输出: // Bob: 90 // David: 90 // Alice: 85 // Charlie: 85 }

例子 2

员工排序(先按部门升序,部门相同按工资降序,工资相同按工号升序)

package main import ( "fmt" "sort" ) type Employee struct { ID int Department string Salary float64 } type ByDeptSalaryID []Employee func (e ByDeptSalaryID) Len() int { return len(e) } func (e ByDeptSalaryID) Swap(i, j int) { e[i], e[j] = e[j], e[i] } func (e ByDeptSalaryID) Less(i, j int) bool { // 第一级:按部门升序 if e[i].Department != e[j].Department { return e[i].Department < e[j].Department } // 第二级:部门相同时,按工资降序 if e[i].Salary != e[j].Salary { return e[i].Salary > e[j].Salary } // 第三级:工资相同时,按工号升序 return e[i].ID < e[j].ID } func main() { employees := []Employee{ {103, "Engineering", 75000}, {101, "Engineering", 80000}, {102, "Engineering", 80000}, {201, "Sales", 70000}, {202, "Sales", 75000}, } sort.Sort(ByDeptSalaryID(employees)) for _, emp := range employees { fmt.Printf("ID: %d, Dept: %s, Salary: %.2f\n", emp.ID, emp.Department, emp.Salary) } // 输出: // ID: 101, Dept: Engineering, Salary: 80000.00 // ID: 102, Dept: Engineering, Salary: 80000.00 // ID: 103, Dept: Engineering, Salary: 75000.00 // ID: 202, Dept: Sales, Salary: 75000.00 // ID: 201, Dept: Sales, Salary: 70000.00 }
http://www.jsqmd.com/news/299521/

相关文章:

  • MySQL 中的 utf8 vs utf8mb4 区别
  • 指针,C语言的灵魂与噩梦:从入门到“放弃”的终极指南 [特殊字符]
  • SAGE-Net:融合语义信息的自动驾驶注意力预测框架
  • Flutter for OpenHarmony:用 StatefulWidget 实现基础用户交互
  • 【读论文】EQ情感智能benchmark:EmoBench
  • YOLO26改进 - 采样 | 小目标分割救星:HWD 降采样少丢细节提精度
  • 【统一功能处理】从入门到源码:拦截器学习指南(含适配器模式深度解读) - 教程
  • 洛谷 P1918:保龄球 ← STL map
  • 详细介绍:C++蓝桥杯之结构体10.15
  • 抖店商品图如何保存到手机上的方法
  • 云端推理中的模型量化技术:减小体积提升速度
  • C++实现ATM状态机
  • 导师严选2026 AI论文工具TOP10:自考论文写作全攻略
  • Java毕设项目推荐-基于SpringBoot的社区公益服务管理平台 基于springboot的社区志愿者服务系统【附源码+文档,调试定制服务】
  • 【计算机毕业设计案例】基于springboot的居民志愿服务智慧系统社区志愿者服务系统(程序+文档+讲解+定制)
  • 学长亲荐8个AI论文平台,助你搞定本科毕业论文!
  • 论文《关于预防人工智能反叛的初步探讨》修订版
  • SMU 2026 ptlks的周报Week 1
  • 2025年少儿编程推荐:五家优选品牌深度全面对比解析
  • 用 CrossOver 体验“魔法世界”:在 Mac 电脑畅玩《霍格沃茨之遗》保姆级教程
  • 2025年少儿编程哪家靠谱?主流上榜五家品牌全面深度解析
  • GLM-ASR-Nano-2512:中文方言识别与低音量语音处理的最佳开源方案
  • 2026年AI智能体替代员工:从理论到实践,小白也能上手的数字员工教程
  • 从入门到精通:RAG系统中检索与生成之间的增强层,收藏级技术指南
  • 【超详细】大模型学习路线图,从入门到应用(建议收藏)
  • 如何系统化的学习金融,投资,理财?
  • 字符串相关
  • 兰亭妙微:以交互与网站设计之力,重塑行业门户新标杆
  • 兰亭妙微:以HTML前端、UI/交互/图标设计赋能数字孪生与大屏设计新标杆
  • 【第三十二周】RAG学习02