Skip to content

sort

TIP

Wenn Sie Entwickler mit Version 1.21 oder höher sind, empfehle ich, die slices Standardbibliothek zum Sortieren zu verwenden. Sie unterstützt Generics und die API ist besser gestaltet.

Das sort Paket in Go bietet offiziell implementierte Sortiermethoden, die meistens sofort einsatzbereit sind. Wenn Sie Strukturen sortieren möchten, müssen Sie die drei Methoden Len(), Swap() und Less() aus dem sort.Interface implementieren. Da die offizielle Implementierung bereits Float64Slice, StringSlice und IntSlice bereitstellt, können diese Typen direkt verwendet werden, ohne eigene Implementierung.

go
type Interface interface {
   // Längenmethode
   Len() int

   // Vergleichsmethode
   Less(i, j int) bool

   // Tauschmethode
   Swap(i, j int)
}

Integer-Sortierung

go
func main() {
   ints := []int{1, 2, 3, 111, 5, 99, 23, 5, 66}
   sort.Ints(ints)
}

Fließkomma-Sortierung

go
func main() {
   floats := []float64{1.0, 2.5, 3.8, 1.11, 5.5, 99.99999, 23.9999, 5.66, 66}
   sort.Float64s(floats)
   fmt.Println(floats)
}

String-Sortierung

go
func main() {
   strings := []string{"helloworld", "aaa", "bbb", "ccc"}
   sort.Strings(strings)
}

Umgekehrte Sortierung

Zuerst mit sort.Reverse verpacken, dann sortieren

go
func main() {
  floats := []float64{1.0, 2.5, 3.8, 1.11, 5.5, 99.99999, 23.9999, 5.66, 66}
  sort.Sort(sort.Reverse(sort.Float64Slice(floats)))
  fmt.Println(floats)
}

Benutzerdefinierte Sortierung

Wenn Sie benutzerdefinierte Strukturen sortieren möchten, müssen Sie die drei Methoden implementieren.

go
type Person struct {
  UserId   string
  Username string
  Age      int
  Address  string
}

type PersonSlice []Person

// Gibt die Länge des Slices zurück
func (p PersonSlice) Len() int {
  return len(p)
}

// Vergleichsmethode
func (p PersonSlice) Less(i, j int) bool {
  return p[i].Age < p[j].Age
}

// Tauschmethode
func (p PersonSlice) Swap(i, j int) {
  p[i], p[j] = p[j], p[i]
}

Da nach Alter verglichen wird, werden die Ergebnisse nach Alter sortiert.

go
func main() {
   persons := []Person{{
      UserId:   "1",
      Username: "wyh",
      Age:      18,
      Address:  "us",
   }, {
      UserId:   "2",
      Username: "jack",
      Age:      17,
      Address:  "ch",
   }, {
      UserId:   "3",
      Username: "mike",
      Age:      15,
      Address:  "india",
   }}

   sort.Sort(PersonSlice(persons))

   fmt.Println(persons)
}

Ist sortiert

Prüft, ob ein Slice sortiert ist. Intern wird nicht sortiert, sondern durch wiederholten Aufruf von Less() geprüft.

go
func main() {
   persons := []Person{{
      UserId:   "1",
      Username: "wyh",
      Age:      18,
      Address:  "us",
   }, {
      UserId:   "2",
      Username: "jack",
      Age:      17,
      Address:  "ch",
   }, {
      UserId:   "3",
      Username: "mike",
      Age:      15,
      Address:  "india",
   }}

   sort.Sort(PersonSlice(persons))

   println(sort.IsSorted(PersonSlice(persons)))
}

Golang by www.golangdev.cn edit