gobyexample/examples/sorting-by-functions/sorting-by-functions.go

47 lines
2.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Иногда мы хотим отсортировать коллекцию по какому-то
// другому признаку, кроме ее естественного порядка.
// Например, предположим, что мы хотели бы отсортировать
// строки по длине, а не по алфавиту. Вот пример
// пользовательских сортировок в Go.
package main
import (
"fmt"
"sort"
)
// Для сортировки по пользовательской функции в Go нам
// нужен соответствующий тип. Здесь мы создали тип
// `byLength`, который является просто псевдонимом для
// `[]string`.
type byLength []string
// Мы реализуем `sort.Interface` - Len`, `Less` и `Swap`
// - для нашего типа, чтобы мы могли использовать общую
// функцию `Sort` пакета `sort`. `Len` и `Swap` обычно
// одинаковы для разных типов, а `Less` будет содержать
// реальную пользовательскую логику сортировки. В нашем
// случае мы хотим отсортировать в порядке увеличения
// длины строки, поэтому мы используем `len(s[i])` и
// `len(s[j])` здесь.
func (s byLength) Len() int {
return len(s)
}
func (s byLength) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
func (s byLength) Less(i, j int) bool {
return len(s[i]) < len(s[j])
}
// Реализовав интерфейс, мы можем теперь реализовать
// нашу собственную сортировку, преобразовав исходный
// срез `fruits` в `byLength`, а затем использовать
// `sort.Sort` для этого типизированного среза.
func main() {
fruits := []string{"peach", "banana", "kiwi"}
sort.Sort(byLength(fruits))
fmt.Println(fruits)
}