Функция slices.SortStableFunc
Функция slices.SortStableFunc сортирует элементы слайса
в порядке возрастания, определяемом пользовательской функцией сравнения.
В отличие от slices.SortFunc, эта функция гарантирует
стабильность сортировки: если два элемента равны согласно функции
сравнения, их относительный порядок сохраняется.
Первый параметр — это слайс для сортировки, второй — функция сравнения,
которая должна возвращать true, если первый элемент должен
располагаться перед вторым.
Синтаксис
slices.SortStableFunc(slice, func(a, b T) int {
// negative if a < b, zero if a == b, positive if a > b
})
Пример
Давайте отсортируем слайс чисел с помощью пользовательской функции, которая сортирует по абсолютному значению:
package 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)
}
Результат выполнения кода:
[0 -1 -2 3 -5 8]
Пример
Отсортируем слайс строк по длине, сохраняя порядок строк одинаковой длины:
package 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)
}
Результат выполнения кода:
[kiwi pear apple grape banana]
Пример
Сортировка слайса структур по нескольким полям с сохранением порядка:
package 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)
}
Результат выполнения кода:
[{Bob 25} {Diana 25} {Alice 30} {Charlie 30}]
Смотрите также
-
функцию
slices.SortFunc,
которая выполняет сортировку с пользовательским компаратором без гарантии стабильности -
функцию
slices.Sort,
которая сортирует слайс с использованием стандартного сравнения -
функцию
slices.IsSortedFunc,
которая проверяет, отсортирован ли слайс с заданным компаратором -
функцию
slices.Reverse,
которая изменяет порядок элементов слайса на обратный