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 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.