Skip to content

sort

TIP

Se sei uno sviluppatore con versione 1.21 o superiore, si consiglia di utilizzare la libreria standard slices per l'ordinamento, supporta i generici e l'API è progettata in modo più ragionevole.

Nel pacchetto sort di Go sono forniti metodi di ordinamento implementati ufficialmente, la maggior parte dei quali può essere utilizzata direttamente. Se si desidera ordinare una struct, è necessario implementare tre metodi sotto sort.Interface: Len(), Swap(), Less(). Poiché l'ufficiale ha già implementato per noi tre tipi Float64Slice, StringSlice, IntSlice, questi tre tipi possono essere utilizzati direttamente senza doverli implementare noi stessi.

go
type Interface interface {
   // Metodo lunghezza
   Len() int

   // Metodo confronto
   Less(i, j int) bool

   // Metodo scambio
   Swap(i, j int)
}

Ordinamento di Interi

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

Ordinamento di Virgole Mobili

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)
}

Ordinamento di Stringhe

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

Ordinamento Inverso

È necessario prima avvolgere con sort.Reverse e poi ordinare

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)
}

Ordinamento Personalizzato

Se si desidera ordinare una struct personalizzata, è necessario implementare tre metodi.

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

type PersonSlice []Person

// Restituisce la lunghezza della slice
func (p PersonSlice) Len() int {
  return len(p)
}

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

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

Poiché il confronto è basato sull'età, il risultato è ordinato in base alla grandezza dell'età.

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)
}

Verifica Se Ordinato

Verifica se una slice è ordinata, internamente non esegue operazioni di ordinamento, ma utilizza un ciclo chiamando Less() per verificare

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