Go 语言程序:按薪资排序员工
在某些情况下,您可能需要根据员工的薪资以特定顺序显示员工列表。在本文中,我们将创建一个 Go 程序,使用 sort.slice() 函数、sort.Interface 接口以及自定义排序函数来按薪资对员工列表进行排序。
语法
func len(v Type) int
len() 方法返回任何参数的长度。它接受一个输入,即我们要了解其长度的数据类型变量,并返回一个整数,表示该变量的长度。
func range(variable)
range 函数迭代任何数据类型。要使用它,首先键入 range 关键字,后跟我们要迭代到的数据类型,循环将迭代到变量的最后一个元素。
方法 1:使用 sort.slice() 函数
此方法提供了一种非常简单的对切片进行排序的方法。通过使用 sort.slice() 函数,我们可以轻松地按升序或降序对切片进行排序。
算法
创建一个 Employee 对象的 "employees" 切片,并使用 Employee 数据填充它。
创建一个 "less" 比较函数,该函数接受两个索引 (i 和 j) 作为输入。
在 "less" 函数中比较 employees[i] 和 employees[j] 的工资。
如果 employees[i] 的工资小于 employees[j] 的工资,则返回 true。
否则返回 false。使用 sort 对 "employees" 切片进行排序。
slice() 方法将切片和 "less" 函数作为输入。
使用 for-each 循环迭代排序后的 "employees" 切片。
使用 fmt.Printf() 函数打印每个员工的姓名和薪资。
示例
以下示例演示了如何使用 sort.sort() 函数根据特定属性对切片进行排序。
package main import ( "fmt" "sort" ) type Employee struct { Name string Salary int } func main() { employees := []Employee{ {Name: "Akhil", Salary: 50000}, {Name: "Akshay", Salary: 30000}, {Name: "Sahil", Salary: 40000}, } less := func(i, j int) bool { return employees[i].Salary < employees[j].Salary } sort.Slice(employees, less) for _, emp := range employees { fmt.Printf("Name: %s, Salary: %d\n", emp.Name, emp.Salary) } }
输出
Name: Akshay, Salary: 30000 Name: Sahil, Salary: 40000 Name: Akhil, Salary: 50000
方法 2:使用 Sort.interface() 接口
此函数允许对我们的数据进行自定义排序。我们可以使用 Go 语言内置的 sort 包通过定义 Len()、Less() 方法来执行排序过程,并对员工切片进行排序。
算法
创建一个 Employee 对象的 "employees" 切片,并使用 Employee 数据填充它。
创建一个名为 "BySalary" 的新类型,以表示 Employee 对象的子集。
为 "BySalary" 类型实现 sort.Interface 接口的 Len()、Swap() 和 Less() 方法。
使用 sort.Sort() 和 "BySalary" 接口对 "employees" 切片进行排序,将 "BySalary(employees)" 作为参数传递。
使用 for-each 循环迭代排序后的 "employees" 切片。
使用 fmt.Printf() 函数打印每个员工的姓名和薪资。
示例
以下示例演示了如何使用自定义类型“BySalary”根据员工的薪资对员工数据切片进行排序。该程序打印排序后的列表,其中包含员工的姓名及其各自的薪资。
package main import ( "fmt" "sort" ) type Employee struct { Name string Salary int } type BySalary []Employee func (s BySalary) Len() int { return len(s) } func (s BySalary) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func (s BySalary) Less(i, j int) bool { return s[i].Salary < s[j].Salary } func main() { employees := []Employee{ {Name: "Akhil", Salary: 50000}, {Name: "Akshay", Salary: 30000}, {Name: "Sahil", Salary: 40000}, {Name: "Nitin", Salary: 45000}, {Name: "Sourab", Salary: 18000}, } sort.Sort(BySalary(employees)) for _, emp := range employees { fmt.Printf("Name: %s, Salary: %d\n", emp.Name, emp.Salary) } }
输出
Name: Sourab, Salary: 18000 Name: Akshay, Salary: 30000 Name: Sahil, Salary: 40000 Name: Nitin, Salary: 45000 Name: Akhil, Salary: 50000
方法 3:使用自定义排序函数和 sort.sort()
此方法涉及一个自定义排序函数,该函数接收员工切片并根据薪资字段对其进行排序。要执行此操作,我们可以使用 sort.sort() 函数。
算法
开始主函数。
创建一个 Employee 对象的 "employees" 切片,并使用 Employee 数据填充它。
创建一个 "sortBySalary" 函数,该函数接收 Employee 对象的切片作为输入。
在 "sortBySalary" 和自定义 "bySalary" 类型内部使用 sort.Sort() 函数对 "employees" 切片进行排序。
为 "bySalary" 类型实现 sort.Interface 接口的 Len()、Swap() 和 Less() 方法。
将 "employees" 切片作为参数发送到 "sortBySalary" 函数。
遍历已排序的 "employees" 切片,使用 for-each 循环。
使用 fmt.Printf() 函数打印每个员工的姓名和薪资。
示例
以下代码根据员工的薪资对名为 employee 的切片进行排序,然后打印员工的姓名及其薪资。
package main import ( "fmt" "sort" ) type Employee struct { Name string Salary int } func sortBySalary(employees []Employee) { sort.Sort(bySalary(employees)) } type bySalary []Employee func (s bySalary) Len() int { return len(s) } func (s bySalary) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func (s bySalary) Less(i, j int) bool { return s[i].Salary < s[j].Salary } func main() { employees := []Employee{ {Name: "Akhil", Salary: 50000}, {Name: "Akshay", Salary: 30000}, {Name: "Sahil", Salary: 40000}, } sortBySalary(employees) for _, emp := range employees { fmt.Printf("Name: %s, Salary: %d\n", emp.Name, emp.Salary) } }
输出
Name: Akshay, Salary: 30000 Name: Sahil, Salary: 40000 Name: Akhil, Salary: 50000
结论
在本文中,我们研究了三种不同的方法来根据员工的薪资对一组 Employee 对象进行排序。Go 的 Sort() 函数使数据排序变得灵活且简单。