Функция slices.SortStableFunc

Функция slices.SortStableFunc сортирует элементы слайса в порядке возрастания, определяемом пользовательской функцией сравнения. В отличие от slices.SortFunc, эта функция гарантирует стабильность сортировки: если два элемента равны согласно функции сравнения, их относительный порядок сохраняется. Первый параметр — это слайс для сортировки, второй — функция сравнения, которая должна возвращать true, если первый элемент должен располагаться перед вторым.

Синтаксис

goslices.SortStableFunc(slice, func(a, b T) int {
  // negative if a < b, zero if a == b, positive if a > b
})

Пример

Давайте отсортируем слайс чисел с помощью пользовательской функции, которая сортирует по абсолютному значению:

gopackage main

import (
  "fmt"
  "slices"
)

func main() {
  nums := []int{-5, 3, -2, 8, -1, 0}

  slices.SortStableFunc(nums, func(a, b int) int {
    absA := a
    if absA < 0 {
      absA = -absA
    }
    absB := b
    if absB < 0 {
      absB = -absB
    }
    return absA - absB
  })

  fmt.Println(nums)
}

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

go[0 -1 -2 3 -5 8]

Пример

Отсортируем слайс строк по длине, сохраняя порядок строк одинаковой длины:

gopackage main

import (
  "fmt"
  "slices"
)

func main() {
  words := []string{"apple", "kiwi", "banana", "pear", "grape"}

  slices.SortStableFunc(words, func(a, b string) int {
    return len(a) - len(b)
  })

  fmt.Println(words)
}

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

go[kiwi pear apple grape banana]

Пример

Сортировка слайса структур по нескольким полям с сохранением порядка:

gopackage main

import (
  "fmt"
  "slices"
)

type Person struct {
  Name string
  Age  int
}

func main() {
  people := []Person{
    {"Alice", 30},
    {"Bob", 25},
    {"Charlie", 30},
    {"Diana", 25},
  }

  slices.SortStableFunc(people, func(a, b Person) int {
    if a.Age != b.Age {
      return a.Age - b.Age
    }
    if a.Name < b.Name {
      return -1
    }
    if a.Name > b.Name {
      return 1
    }
    return 0
  })

  fmt.Println(people)
}

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

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

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

  • функцию slices.SortFunc,
    которая выполняет сортировку с пользовательским компаратором без гарантии стабильности
  • функцию slices.Sort,
    которая сортирует слайс с использованием стандартного сравнения
  • функцию slices.IsSortedFunc,
    которая проверяет, отсортирован ли слайс с заданным компаратором
  • функцию slices.Reverse,
    которая изменяет порядок элементов слайса на обратный