Введение
Этот лаба旨在测试您按自然顺序以外的方式对集合进行排序的能力。在这种情况下,我们将按字符串长度而不是字母顺序对字符串进行排序。
This tutorial is from open-source community. Access the source code
💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал
Этот лаба旨在测试您按自然顺序以外的方式对集合进行排序的能力。在这种情况下,我们将按字符串长度而不是字母顺序对字符串进行排序。
Задача, которую необходимо решить в этом лаба, - это реализовать пользовательскую функцию сортировки на Go, которая сортирует срез строк по их длине.
byLength
должен быть создан как псевдоним для типа []string
.sort.Interface
для типа byLength
.Len
и Swap
должны быть реализованы для типа byLength
.Less
должна быть реализована для типа byLength
, чтобы содержать фактическую логику пользовательской сортировки.main
нужно преобразовать исходный срез fruits
в byLength
, а затем использовать sort.Sort
для этого типизированного среза.## Запуск нашей программы показывает отсортированный по длине строк список, как и ожидалось.
$ go run sorting-by-functions.go
[kiwi peach banana]
## Следуя этой же схеме создания пользовательского типа, реализации трех методов `Interface` для этого типа и затем вызову `sort.Sort` для коллекции этого пользовательского типа, мы можем сортировать срезы Go по произвольным функциям.
Ниже представлен полный код:
// Иногда мы хотим отсортировать коллекцию по чему-то, кроме其自然ного порядка. Например, предположим, что мы хотим отсортировать строки по их длине, а не по алфавиту. Вот пример пользовательской сортировки на 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)
}
В этом лабе мы узнали, как сортировать коллекцию по чему-то, кроме其自然ного порядка. Мы реализовали пользовательскую функцию сортировки на Go, которая сортирует срез строк по их длине.