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() 函数使数据排序变得灵活且简单。

更新于: 2023年7月6日

285 次查看

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告