Řazení
Seřadit seznam znamená dát jeho prvky do pořadí, a to za vás Lua udělá funkcí table.sort. Čísla seřadí od nejmenšího po největší:
local vahy = {8, 12, 7, 15, 10}
table.sort(vahy)
print(table.concat(vahy, " "))Vypíše:
7 8 10 12 15table.sort mění přímo seznam: prvky se přesunou na nová místa. Nic nevrací, takže si její výsledek neukládejte. Po local serazene = table.sort(vahy) je v serazene hodnota nil. Napište prostě table.sort(vahy) na samostatný řádek a dál používejte vahy.
V seřazeném seznamu je nejmenší prvek první, vahy[1], a největší poslední, vahy[#vahy]. To se hodí, ale původní pořadí se ztratí. Když potřebujete vědět, kde prvek byl, třeba který den byl nejlepší, použijte radši cyklus z minulého cvičení. Prvky od největšího po nejmenší dostanete tak, že seřazený seznam projdete pozpátku:
local vahy = {8, 12, 7, 15, 10}
table.sort(vahy)
for i = #vahy, 1, -1 do
io.write(vahy[i], " ")
end
print()Vypíše:
15 12 10 8 7 table.sort umí řadit i rovnou od největšího, ale k tomu jí musíte dát funkci, která porovná dva prvky. Takové funkce budete psát v lekci o funkcích.
Řadit jdou i texty, ale ne úplně jako ve slovníku. Lua je porovnává znak po znaku podle kódů znaků, a v těch jsou všechna velká písmena před všemi malými:
local plodiny = {"rajčata", "mrkev", "Dýně", "pšenice", "brambory"}
table.sort(plodiny)
print(table.concat(plodiny, ", "))Vypíše:
Dýně, brambory, mrkev, pšenice, rajčata"Dýně" se dostala na začátek jen kvůli velkému D. Když chcete pořadí jako ve slovníku, pište všechny texty stejně, třeba malými písmeny. (V lekci o řetězcích se naučíte měnit velká písmena na malá v kódu.)
S češtinou je ještě jedna potíž: písmena s diakritikou (á, č, ř, š, ž…) mají kódy větší než všechna písmena bez ní. Proto slova začínající na Č, Š nebo Ž skončí až za slovy na Z:
local plodiny = {"zelí", "čočka", "brambory", "šťovík", "rajčata"}
table.sort(plodiny)
print(table.concat(plodiny, ", "))Vypíše:
brambory, rajčata, zelí, čočka, šťovíkPro české abecední pořadí by table.sort potřebovala vlastní porovnávací funkci. Zatím počítejte s tím, že takové texty skončí na konci.
Čísla zapsaná jako texty se řadí jako texty, znak po znaku: z {"10", "9", "100"} se stane "10", "100", "9", protože znak 1 je před 9. Čísla proto ukládejte jako čísla. A seznam, ve kterém jsou čísla i texty, seřadit vůbec nejde, protože Lua neumí porovnat číslo s textem:
local smes = {3, "mrkev"}
table.sort(smes)attempt to compare string with number
stack traceback:
[C]: in function 'table.sort'
main.lua:2: in main chunkTahle hláška nemá na začátku main.lua: a číslo řádku, protože chyba nastala uvnitř table.sort. Řádek vašeho programu najdete ve výpisu volání (stack traceback): main.lua:2: in main chunk.
Jak psát:
Pokyny
Na konci programu seřaďte vahy pomocí table.sort.
Vypište seřazené váhy pomocí table.concat, oddělené mezerami: Seřazeno: 7 8 9 10 12 15.
Vypište tři nejtěžší dýně, od té nejtěžší. Projděte konec seřazeného seznamu pozpátku: Tři nejtěžší: 15 12 10.
Seřaďte i plodiny a vypište je: Plodiny: a za tím table.concat(plodiny, ", "). Dýně je první kvůli velkému písmenu. Opravte seznam na začátku programu tak, aby byly plodiny v abecedním pořadí: Plodiny: brambory, dýně, kukuřice, mrkev, rajčata.
Začněte programovat zdarma
10/11