GoLang Sort Slice of Structs

Sheeraz Gul 20 Juni 2023
  1. GoLang Sort Slice of Structs
  2. Segment von Strukturen nach einem Feld sortieren
  3. Segment von Strukturen nach mehreren Feldern sortieren
GoLang Sort Slice of Structs

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 Gul avatar Sheeraz Gul avatar

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 Facebook

Verwandter Artikel - Go Slice

Verwandter Artikel - Go Struct