Sorting by Functions

Сортування функціями|Sorting by Functions #

// Інколи виникає необхідність у реалізації сортування,
// але по-іншому, не в натуральному порядку. Наприклад,
// сортування рядків за довжиною, на противагу сортуванню
// за алфавітом. Спробуємо розібратись як це реалізувати у GO.

package main

import (
	"cmp"
	"fmt"
	"slices"
)

func main() {
	fruits := []string{"peach", "banana", "kiwi"}

	// Ми імплементуємо функцію порівняння довжини рядків.
	// `cmp.Compare` нам дуже допоможе.
	lenCmp := func(a, b string) int {
		return cmp.Compare(len(a), len(b))
	}

	// Тепер ми викличемо `slices.SortFunc` з нашою
	// функцією порівняння.
	slices.SortFunc(fruits, lenCmp)
	fmt.Println(fruits)

	// Ви можете використовувати туж техніку для сортування зрізу
	// значень що не є базовими типами.
	type Person struct {
		name string
		age  int
	}

	people := []Person{
		{name: "Jax", age: 37},
		{name: "TJ", age: 25},
		{name: "Alex", age: 72},
	}

	// Сортування `people` за віком використовувючи `slices.SortFunc`.
	//
	// Зауваження: якщо `Person` структура велика,
	// спробуйте скористатись зрізом що містить `*Person`
	// і змінити сортуючу функцію відповідно. Якщо в сумнівах [вимірюйте щвидкодію](testing-and-benchmarking)!
	slices.SortFunc(people,
		func(a, b Person) int {
			return cmp.Compare(a.age, b.age)
		})
	fmt.Println(people)
}
$ go run sorting-by-functions.go
[kiwi peach banana]
[{TJ 25} {Jax 37} {Alex 72}]