Интерфейс sort.Interface
Интерфейс sort.Interface предназначен для реализации
алгоритмов сортировки пользовательских коллекций.
Он содержит три метода, которые необходимо реализовать
для любого типа, который вы хотите сортировать с помощью
пакета sort.
Методы интерфейса
type Interface interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
}
Метод Len возвращает количество элементов в коллекции.
Метод Less определяет, должен ли элемент с индексом i
находиться перед элементом с индексом j.
Метод Swap меняет местами элементы с индексами i и j.
Пример
Создадим пользовательский тип Person и реализуем
сортировку по возрасту:
package main
import (
"fmt"
"sort"
)
type Person struct {
Name string
Age int
}
type ByAge []Person
func (a ByAge) Len() int {
return len(a)
}
func (a ByAge) Less(i, j int) bool {
return a[i].Age < a[j].Age
}
func (a ByAge) Swap(i, j int) {
a[i], a[j] = a[j], a[i]
}
func main() {
people := []Person{
{"Alice", 30},
{"Bob", 25},
{"Charlie", 35},
}
sort.Sort(ByAge(people))
fmt.Println(people)
}
Результат выполнения кода:
[{Bob 25} {Alice 30} {Charlie 35}]
Пример
Реализуем сортировку по имени (в алфавитном порядке):
package main
import (
"fmt"
"sort"
)
type Person struct {
Name string
Age int
}
type ByName []Person
func (a ByName) Len() int {
return len(a)
}
func (a ByName) Less(i, j int) bool {
return a[i].Name < a[j].Name
}
func (a ByName) Swap(i, j int) {
a[i], a[j] = a[j], a[i]
}
func main() {
people := []Person{
{"Charlie", 35},
{"Alice", 30},
{"Bob", 25},
}
sort.Sort(ByName(people))
fmt.Println(people)
}
Результат выполнения кода:
[{Alice 30} {Bob 25} {Charlie 35}]
Пример
Обратная сортировка с использованием sort.Reverse:
package main
import (
"fmt"
"sort"
)
type Person struct {
Name string
Age int
}
type ByAge []Person
func (a ByAge) Len() int {
return len(a)
}
func (a ByAge) Less(i, j int) bool {
return a[i].Age < a[j].Age
}
func (a ByAge) Swap(i, j int) {
a[i], a[j] = a[j], a[i]
}
func main() {
people := []Person{
{"Alice", 30},
{"Bob", 25},
{"Charlie", 35},
}
sort.Sort(sort.Reverse(ByAge(people)))
fmt.Println(people)
}
Результат выполнения кода:
[{Charlie 35} {Alice 30} {Bob 25}]
Смотрите также
-
функцию
sort.Sort,
которая выполняет сортировку через интерфейсsort.Interface -
функцию
sort.Stable,
которая выполняет стабильную сортировку -
функцию
sort.IsSorted,
которая проверяет, отсортирована ли коллекция -
функцию
sort.Reverse,
которая меняет порядок сортировки на обратный