举两个例子,说明 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
}