Menu
CoddyTech

Пользовательская сортировка

Часть раздела Логика и потоки выполнения путешествия по 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). Такая форма называется лямбда-функцией; она рассматривается в главе «Расширенные функции».

challenge icon

Задание

Легко

Программа считывает две строки: целые числа, разделённые пробелами, и слова, разделённые пробелами. Данный код сохраняет их в numbers (массив целых чисел) и words (массив строк).

  1. Напиши функцию сравнения by_length(a: String, b: String) -> bool на верхнем уровне. Сначала должно идти более короткое слово, а слова одинаковой длины должны располагаться в алфавитном порядке.
  2. Выведи четыре строки: числа в порядке возрастания, числа в порядке убывания, слова в алфавитном порядке (с помощью 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и потоки выполнения

Потренируйтесь самостоятельно: Онлайн-компилятор GDScript