Интерфейс sort.Interface

Интерфейс sort.Interface предназначен для реализации алгоритмов сортировки пользовательских коллекций. Он содержит три метода, которые необходимо реализовать для любого типа, который вы хотите сортировать с помощью пакета sort.

Методы интерфейса

gotype Interface interface {
  Len() int
  Less(i, j int) bool
  Swap(i, j int)
}

Метод Len возвращает количество элементов в коллекции. Метод Less определяет, должен ли элемент с индексом i находиться перед элементом с индексом j. Метод Swap меняет местами элементы с индексами i и j.

Пример

Создадим пользовательский тип Person и реализуем сортировку по возрасту:

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

Результат выполнения кода:

go[{Bob 25} {Alice 30} {Charlie 35}]

Пример

Реализуем сортировку по имени (в алфавитном порядке):

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

Результат выполнения кода:

go[{Alice 30} {Bob 25} {Charlie 35}]

Пример

Обратная сортировка с использованием sort.Reverse:

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

Результат выполнения кода:

go[{Charlie 35} {Alice 30} {Bob 25}]

Смотрите также

  • функцию sort.Sort,
    которая выполняет сортировку через интерфейс sort.Interface
  • функцию sort.Stable,
    которая выполняет стабильную сортировку
  • функцию sort.IsSorted,
    которая проверяет, отсортирована ли коллекция
  • функцию sort.Reverse,
    которая меняет порядок сортировки на обратный