Сортировка с использованием функций

GolangGolangBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Этот лаба旨在测试您按自然顺序以外的方式对集合进行排序的能力。在这种情况下,我们将按字符串长度而不是字母顺序对字符串进行排序。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/AdvancedTopicsGroup(["Advanced Topics"]) go/AdvancedTopicsGroup -.-> go/sorting("Sorting") subgraph Lab Skills go/sorting -.-> lab-15507{{"Сортировка с использованием функций"}} end

Сортировка с использованием функций

Задача, которую необходимо решить в этом лаба, - это реализовать пользовательскую функцию сортировки на 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, которая сортирует срез строк по их длине.