Пользовательская сортировка с помощью функций
Часть раздела Logic & Flow путешествия по Lua на Coddy — урок 8 из 54.
Хотя table.sort() отлично работает для простых списков чисел или строк, данные в реальном мире часто более сложны. У вас может быть таблица записей игроков, предметов инвентаря или игровых очков, где каждая запись сама по себе является таблицей с несколькими полями.
Для сортировки этих сложных структур вам нужно указать table.sort(), как именно сравнивать две записи. Именно здесь пользовательские функции сравнения становятся необходимыми. Функция сравнения принимает два элемента и возвращает true, если первый должен стоять перед вторым в отсортированном порядке.
Вот пример с таблицей записей игроков:
local players = {
{name = "Alice", score = 150},
{name = "Bob", score = 200},
{name = "Charlie", score = 175}
}
table.sort(players, function(a, b)
return a.score > b.score
end)После сортировки таблица players будет упорядочена по score в порядке убывания: Bob первым (200), Charlie вторым (175) и Alice третьей (150). Функция сравнения обращается к полю score каждой таблицы игрока для определения их порядка.
Вы можете выполнять сортировку по любому полю: по именам в алфавитном порядке, по уровням в числовом или даже комбинировать несколько критериев.
Шпаргалка
Для сортировки таблиц со сложными структурами данных используйте пользовательскую функцию сравнения с table.sort(). Функция сравнения принимает два элемента и возвращает true, если первый должен идти перед вторым.
local players = {
{name = "Alice", score = 150},
{name = "Bob", score = 200},
{name = "Charlie", score = 175}
}
table.sort(players, function(a, b)
return a.score > b.score
end)Это сортирует игроков по количеству очков в порядке убывания. Вы можете сортировать по любому полю в структуре таблицы.
Попробуйте сами
В этом уроке нет задания по программированию.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутая итерация таблиц
Итерация с помощью pairs()Итерация с помощью ipairs()pairs() против ipairs()Повторение — Лист персонажа2Дополнительные функции библиотеки table
table.concat()Создание таблиц и unpack()table.sort()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордов