Skip to content

sort

TIP

Si es un desarrollador de la versión 1.21 o superior, recomiendo usar la biblioteca estándar slices para ordenar. Admite genéricos y el diseño de la API es más razonable.

El paquete sort en Go proporciona métodos de ordenamiento implementados oficialmente, la mayoría de los cuales se pueden usar directamente. Si desea ordenar una estructura, debe implementar tres métodos bajo sort.Interface: Len(), Swap() y Less(). Dado que la implementación oficial ya nos ha proporcionado tres tipos Float64Slice, StringSlice e IntSlice, podemos usar estos tres tipos directamente sin necesidad de implementarlos nosotros mismos.

go
type Interface interface {
   // Método de longitud
   Len() int

   // Método de comparación
   Less(i, j int) bool

   // Método de intercambio
   Swap(i, j int)
}

Ordenamiento de enteros

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

Ordenamiento de punto flotante

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

Ordenamiento de cadenas

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

Ordenamiento inverso

Primero debe envolver con sort.Reverse y luego ordenar

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

Ordenamiento personalizado

Si desea ordenar una estructura personalizada, debe implementar tres métodos.

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

type PersonSlice []Person

// Devuelve la longitud del slice
func (p PersonSlice) Len() int {
  return len(p)
}

// Método de comparación
func (p PersonSlice) Less(i, j int) bool {
  return p[i].Age < p[j].Age
}

// Método de intercambio
func (p PersonSlice) Swap(i, j int) {
  p[i], p[j] = p[j], p[i]
}

Dado que la comparación se basa en la edad, el resultado se ordena según la edad.

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

¿Está ordenado?

Determina si un slice está ordenado. Internamente no realiza operaciones de ordenamiento, sino que llama a Less() en bucle para determinar

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 editado por www.golangdev.cn