GoLang Sort Slice of Structs
- GoLang Sort Slice of Structs
- Segment von Strukturen nach einem Feld sortieren
- Segment von Strukturen nach mehreren Feldern sortieren
Dieses Tutorial zeigt, wie Sie den Slice von Strukturen in GoLang sortieren.
GoLang Sort Slice of Structs
GoLang bietet zwei Methoden zum Sortieren eines Segments von Strukturen; eine ist sort.Slice
und die andere ist sort.SliceStable
. Wir müssen zusammen mit diesen beiden Methoden auch eine weniger
-Funktion verwenden, um ein Segment von Strukturen zu sortieren.
Die Syntax für diese Methoden lautet:
//sort.Slice
func Slice(x StructSlice, less func(i, j int) bool)
//sort.SliceStable
func Slice(x StructSlice, less func(i, j int) bool)
Wobei x
der Slice von Structs ist, wird der Slice basierend auf der Funktion less
sortiert. Lassen Sie uns versuchen, einige Beispiele zu implementieren, um zu verstehen, wie Segmente von Strukturen in GoLang sortiert werden.
Segment von Strukturen nach einem Feld sortieren
Das Sortieren eines Struct-Slice nach einem Feld ist das grundlegende Beispiel für das Sortieren eines Struct-Slice. Sehen wir uns ein Beispiel an, wo wir einen Wert eines Mitglieds eines Struct-Slice mit dem anderen Mitglied desselben Struct-Slice basierend auf dem Feld vergleichen.
package main
import (
"fmt"
"sort"
)
type Employee struct {
Name string
Salary int
}
func main() {
// Sort in Ascending order
employees := []Employee{
{Name: "John", Salary: 1500},
{Name: "Joe", Salary: 3000},
{Name: "Jack", Salary: 3400},
}
sort.Slice(employees, func(i, j int) bool {
return employees[i].Salary < employees[j].Salary
})
fmt.Println(employees)
// Sort in Descending order
employees1 := []Employee{
{Name: "John", Salary: 1500},
{Name: "Joe", Salary: 3000},
{Name: "Jack", Salary: 3400},
}
sort.Slice(employees1, func(i, j int) bool {
return employees1[i].Salary > employees1[j].Salary
})
fmt.Println(employees1)
}
Der obige Code enthält eine Struktur Employee
mit zwei Feldern Name
und Salary
, dann erstellt er ein Slice der Struktur und sortiert es in aufsteigender Reihenfolge basierend auf dem Feld Salary
mit der Slice
-Methode und dann Sortieren Sie ein weiteres Slice in absteigender Reihenfolge.
Siehe die Ausgabe:
[{John 1500} {Joe 3000} {Jack 3400}]
[{Jack 3400} {Joe 3000} {John 1500}]
Jetzt können wir sort.SliceStable
nicht für diese Arten von Slices verwenden, die Schlüssel-Wert-Paare (Maps) des Dateinamens und -werts enthalten. Mit sort.SliceStable
können wir einfache Slices von Structs sortieren, die nur Werte enthalten.
package main
import (
"fmt"
"sort"
)
type Employee struct {
Name string
Salary int
}
func main() {
// Sort in Ascending order
employees := []Employee{
{"John", 1500},
{"Joe", 3000},
{"Jack", 3400},
}
sort.SliceStable(employees, func(i, j int) bool {
return employees[i].Salary < employees[j].Salary
})
fmt.Println(employees)
// Sort in Descending order
employees1 := []Employee{
{"John", 1500},
{"Joe", 3000},
{"Jack", 3400},
}
sort.SliceStable(employees1, func(i, j int) bool {
return employees1[i].Salary > employees1[j].Salary
})
fmt.Println(employees1)
}
Der obige Code sortiert den Structs-Slice auf ähnliche Weise basierend auf einem Feld ohne die Schlüssel-Wert-Paare aus Namen und Werten in dem Structs-Slice.
Siehe die Ausgabe:
[{John 1500} {Joe 3000} {Jack 3400}]
[{Jack 3400} {Joe 3000} {John 1500}]
Segment von Strukturen nach mehreren Feldern sortieren
Das Sortieren eines Segments von Strukturen nach mehreren Feldern ist ebenfalls möglich. Wir müssen die weniger
-Funktion erweitern; Versuchen wir es an einem Beispiel.
package main
import (
"fmt"
"sort"
)
type Employee struct {
Name string
Position string
}
func main() {
// Sort in Descending order
employees := []Employee{
{"Michael", "Developer"},
{"Jack", "Manager"},
{"Joe", "CEO"},
{"Leonard", "Intern"},
{"Sheldon", "Developer"},
}
sort.SliceStable(employees, func(i, j int) bool {
if employees[i].Position != employees[j].Position {
return employees[i].Position < employees[j].Position
}
return employees[i].Name < employees[j].Name
})
fmt.Println(employees)
// Sort in Ascending order
employees1 := []Employee{
{"Michael", "Developer"},
{"Jack", "Manager"},
{"Joe", "CEO"},
{"Leonard", "Intern"},
{"Sheldon", "Developer"},
}
sort.SliceStable(employees1, func(i, j int) bool {
if employees1[i].Position != employees1[j].Position {
return employees1[i].Position > employees1[j].Position
}
return employees1[i].Name > employees1[j].Name
})
fmt.Println(employees1)
}
Der obige Code sortiert sowohl nach Name
als auch nach Position
, wobei, wenn die Position für zwei Mitarbeiter gleich ist, diese nach dem Feld Name
sortiert wird. Der Slice der Struktur wird in absteigender und aufsteigender Reihenfolge sortiert.
Siehe die Ausgabe:
[{Joe CEO} {Michael Developer} {Sheldon Developer} {Leonard Intern} {Jack Manager}]
[{Jack Manager} {Leonard Intern} {Sheldon Developer} {Michael Developer} {Joe CEO}]
Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.
LinkedIn FacebookVerwandter Artikel - Go Slice
- Wie löscht man ein Element aus einer Slice in Golang
- Golang-Kopie-Slice
- Erstellen ein leeres Slice in Go
- Überprüfen Sie, ob ein Slice ein Element in Golang enthält
- Unterschied zwischen []String und ...String in Go