Golang 按工资对员工进行排序
有一些情况下,您可能有一份员工名单,您需要根据他们的薪水对他们进行排序并以特定顺序显示。在本文中,我们将使用 sort.slice() 函数、sort.interface 接口以及自定义排序函数来创建一个 Go 程序来对员工名单按工资进行排序。
语法
func len(v Type) int
len() 方法返回任何参数的长度。它接受一个输入,即我们想要知道长度的数据类型变量,并返回变量的长度的整数值。
func range(variable)
range函数可以迭代任何数据类型。要利用这一点,首先输入range关键字,然后是要迭代的数据类型,循环将一直迭代到变量的最后一个元素。
方法1:使用sort.slice()函数
这种方法提供了一种非常简单的方式来对切片进行排序。通过使用sort.slice()函数,我们可以轻松地按任意顺序(升序或降序)对切片进行排序。
步骤
- 创建一个名为”employees”的Employee对象的切片,并用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语言的内置排序包来定义Len(),Less()方法,并对员工切片进行排序。
步骤
- 创建一个名为“employees”的Employee对象切片,并用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()函数。
步骤
- 开始主函数。
-
创建一个名为”employees”的Employee对象切片并填充Employee数据。
-
创建一个名为”sortBySalary”的函数,该函数以Employee对象切片作为输入。
-
使用sort.Sort()函数和自定义的”bySalary”类型在”sortBySalary”函数内对”employees”切片进行排序。
-
为”bySalary”类型实现sort.Interface接口的Len()、Swap()和Less()方法。
-
将”employees”切片作为参数传递给”sortBySalary”函数。
-
遍历已排序的”employees”切片的每个元素。
-
使用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
结论
在本文中,我们介绍了三种不同的方式来根据员工薪资对员工对象进行排列。使用Go的Sort()函数可以灵活简单地进行数据排序。