Сортировка
Расставить список по порядку называется сортировкой, и Lua делает это за вас с помощью table.sort. Числа она сортирует от меньшего к большему:
local weights = {8, 12, 7, 15, 10}
table.sort(weights)
print(table.concat(weights, " "))Выведется:
7 8 10 12 15table.sort меняет сам список: элементы переезжают на новые места. Она ничего не возвращает, поэтому не сохраняйте её результат. После local sorted = table.sort(weights) в sorted будет nil. Просто напишите table.sort(weights) на отдельной строке и продолжайте работать с weights.
В отсортированном списке наименьший элемент стоит первым, weights[1], а наибольший — последним, weights[#weights]. Это удобно, но исходный порядок потерян. Если нужно знать, где элемент стоял, например какой день был лучшим, используйте цикл из предыдущего упражнения. А чтобы получить элементы от наибольшего к наименьшему, пройдите по отсортированному списку назад:
local weights = {8, 12, 7, 15, 10}
table.sort(weights)
for i = #weights, 1, -1 do
io.write(weights[i], " ")
end
print()Выведется:
15 12 10 8 7 table.sort умеет сортировать и от наибольшего сразу, но для этого ей нужно передать функцию, которая сравнивает два элемента. Такие функции вы будете писать в уроке о функциях.
Строки тоже можно сортировать, но не совсем так, как в словаре. Lua сравнивает их посимвольно, по кодам символов, а в этих кодах все заглавные буквы стоят раньше всех строчных:
local crops = {"картофель", "морковь", "Тыква", "пшеница", "кукуруза"}
table.sort(crops)
print(table.concat(crops, ", "))Выведется:
Тыква, картофель, кукуруза, морковь, пшеница"Тыква" оказалась первой только из-за заглавной буквы Т. Если нужен порядок как в словаре, пишите все строки одинаково, например строчными буквами. (Как менять регистр букв в коде, вы узнаете в уроке о строках.) Буква ё стоит в таблице кодов после я, поэтому в отсортированном списке она окажется после всех остальных русских букв.
Числа, записанные строками, сортируются как строки, символ за символом: {"10", "9", "100"} превратится в "10", "100", "9", потому что символ 1 стоит раньше 9. Храните числа числами. А список, в котором есть и числа, и строки, отсортировать нельзя вообще, потому что Lua не умеет сравнивать число со строкой:
local mixed = {3, "морковь"}
table.sort(mixed)attempt to compare string with number
stack traceback:
[C]: in function 'table.sort'
main.lua:2: in main chunkВ начале этого сообщения нет main.lua: и номера строки, потому что ошибка произошла внутри table.sort. Строку вашей программы ищите в трассировке стека (traceback): main.lua:2: in main chunk.
Задание
- 1
В конце программы отсортируйте
weightsс помощьюtable.sort. - 2
Выведите отсортированные веса с помощью
table.concat, через пробел:Отсортировано: 7 8 9 10 12 15. - 3
Выведите три самые тяжёлые тыквы, начиная с самой тяжёлой. Пройдите по концу отсортированного списка назад:
Лучшие три: 15 12 10. - 4
Отсортируйте и
cropsи выведите их:Культуры:и дальшеtable.concat(crops, ", ").Тыкваоказывается первой из-за заглавной буквы. Исправьте список в начале программы, чтобы культуры шли по алфавиту:Культуры: картофель, кукуруза, морковь, пшеница, тыква.