news 2026/5/14 6:30:06

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/5 19:26:18

如何系统化的学习金融,投资,理财?

系统化学习金融、投资、理财&#xff0c;需要遵循 “搭建知识框架→夯实理论基础→实践验证迭代→优化思维体系” 的逻辑路径&#xff0c;三者环环相扣&#xff0c;缺一不可。以下是分阶段的详细学习方案&#xff0c;兼顾理论深度与实操性&#xff1a;一、 第一阶段&#xff1a…

作者头像 李华
网站建设 2026/5/12 20:48:48

传统ChatBot四大瓶颈与AgenticRAG完整认知闭环:工业级开发实践

传统ChatBot因架构认知局限难以实现生产级可靠性。AgenticRAG通过理解推理验证实现完整认知闭环&#xff0c;Agent作为AI应用层操作系统决定应用可靠性与复杂度上限。深蓝学院开设工业级RAG系统与Agent应用开发实战课程&#xff0c;由商汤科技专家授课&#xff0c;帮助学员从Pr…

作者头像 李华
网站建设 2026/5/12 20:48:43

【柔性作业车间调度问题FJSP】基于部落竞争与成员合作算法CTCM求解柔性作业车间调度问题(FJSP)研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

作者头像 李华
网站建设 2026/5/12 1:22:11

SpringBoot - yml配置文件

SpringBoot使用一个全局配置文件&#xff0c;配置文件名固定&#xff1a; application.propertiesapplication.yml application.properties端口设置8081&#xff0c;application.yml端口设置8082&#xff0c;运行启动类&#xff0c;优先走8081。 两个配置文件互补&#xff0c;a…

作者头像 李华