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.
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
func main() {
ints := []int{1, 2, 3, 111, 5, 99, 23, 5, 66}
sort.Ints(ints)
}Ordenamiento de punto flotante
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
func main() {
strings := []string{"helloworld", "aaa", "bbb", "ccc"}
sort.Strings(strings)
}Ordenamiento inverso
Primero debe envolver con sort.Reverse y luego ordenar
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.
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.
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
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)))
}