Пользовательская сортировка
Часть раздела Логика и потоки выполнения путешествия по GDScript на Coddy. Урок 51 из 78.
sort() располагает массив в порядке возрастания и изменяет сам массив. Числа располагаются от меньшего к большему, а строки — в том же порядке, что и при использовании min(): сначала заглавные буквы. Затем reverse() располагает элементы в порядке убывания:
var scores := [40, 95, 12, 70]
scores.sort()
print(scores) # [12, 40, 70, 95]
scores.reverse()
print(scores) # [95, 70, 40, 12]Для любого другого порядка вызови sort_custom() с помощью функции сравнения. Она получает два элемента — a и b — и возвращает true, когда a должен идти перед b. Передай функцию по имени, без скобок:
func by_length(a: String, b: String) -> bool:
return a.length() < b.length()
func _ready():
var words := ["banana", "fig", "kiwi"]
words.sort_custom(by_length)
print(words) # ["fig", "kiwi", "banana"]Сравнение может заглядывать внутрь элементов. В этом примере словарь с наибольшим значением "hp" ставится первым:
func by_hp(a: Dictionary, b: Dictionary) -> bool:
return a["hp"] > b["hp"]Сортировка нестабильна: элементы, которые сравниваются как равные, могут оказаться в любом порядке. Когда важен порядок при совпадении, сравнивайте второе поле, если первое совпадает:
func by_score_then_name(a: Dictionary, b: Dictionary) -> bool:
if a["score"] != b["score"]:
return a["score"] > b["score"]
return a["player"] < b["player"]sort_custom() есть у Array, но нет у PackedStringArray, который возвращает split(), поэтому сначала преобразуй его с помощью Array(...). Ты также встретишь сравнение, записанное прямо здесь, например sort_custom(func(a, b): return a > b). Такая форма называется лямбда-функцией; она рассматривается в главе «Расширенные функции».
Задание
ЛегкоПрограмма считывает две строки: целые числа, разделённые пробелами, и слова, разделённые пробелами. Данный код сохраняет их в numbers (массив целых чисел) и words (массив строк).
- Напиши функцию сравнения
by_length(a: String, b: String) -> boolна верхнем уровне. Сначала должно идти более короткое слово, а слова одинаковой длины должны располагаться в алфавитном порядке. - Выведи четыре строки: числа в порядке возрастания, числа в порядке убывания, слова в алфавитном порядке (с помощью
sort()) и слова, отсортированные с помощьюsort_custom(by_length).
Для входных данных 5 3 8 1 2 и elephant cat dolphin bee вывод будет таким:
Ascending: [1, 2, 3, 5, 8]
Descending: [8, 5, 3, 2, 1]
Alphabetical: ["bee", "cat", "dolphin", "elephant"]
By length: ["bee", "cat", "dolphin", "elephant"]Попробуйте сами
extends Node
# Напишите здесь функцию сравнения by_length()
func _ready():
var numbers: Array[int] = []
for text in OS.read_string_from_stdin().split(" ", false):
numbers.append(int(text))
var words := Array(OS.read_string_from_stdin().split(" ", false))
# Отсортируйте массивы и выведите четыре строки
pass
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и потоки выполнения
1Строки: углублённое изучение
Методы строкПоиск в строкахЗамена и обрезка пробеловРазделение и объединениеПовторение — проверка имени пользователя4Словари. Часть 2
Вложенные словариМассивы словарейОбъединение словарейКопирование словарейПовторение — подсчёт частоты10Продвинутые функции
Возврат нескольких значенийЛямбда-функции. Часть 1Лямбда-функции. Часть 2Повторение — сортировка с помощью лямбда-функцииРекурсивные функции. Часть 1Рекурсивные функции. Часть 2Повторение — сумма вложенного массива13Система управления запасами
Обзор проектаДобавление товара2Продвинутое управление ветвлением
Сопоставление с переменнымиУсловия в шаблонахШаблоны массивовШаблоны словарейПроверка принадлежностиИтоги — парсер команд5Приложение «Телефонная книга»
Показать менюДобавить контакт8Менеджер успеваемости студентов
Обзор проектаДобавить студента3Многомерные массивы
Основы двумерных массивовДоступ к элементам двумерного массиваВложенные циклы с двумерными массивамиПовторение: двумерные массивыРваные массивыТипичные шаблоны работы с двумерными массивамиПовторение: игровое поле6Множества и словари
Что такое множество?Словарь как множествоДобавление и удалениеОбъединение и пересечениеРазность множествПовторение — удаление дубликатов9Расширенная агрегация данных
Суммирование значенийПоиск минимального и максимального значенийПользовательская сортировкаПовторение — сортировщик словарейПотренируйтесь самостоятельно: Онлайн-компилятор GDScript