Řazení pomocí funkce
V lekci o seznamech řadila funkce table.sort(t) čísla od nejmenšího a texty podle kódů znaků. To proto, že table.sort porovnává prvky pomocí <. Chcete-li řadit jinak, předejte jí druhý argument: funkci, která porovná dva prvky. table.sort ji volá znovu a znovu se dvěma prvky, a a b, a funkce vrátí true, když má a být před b:
local sklizen = {12, 30, 7, 45, 18}
table.sort(sklizen, function(a, b)
return a > b
end)
print(table.concat(sklizen, " "))Vypíše:
45 30 18 12 7„a je první, když je větší“ dá seznam od největšího po nejmenší. Funkce je anonymní a napsaná přímo ve volání, jako v předchozím cvičení, takže end) uzavírá funkci i volání. Když stejné pořadí potřebujete na víc místech, pojmenujte funkci a předávejte její název: table.sort(sklizen, vetsiNapred).
Funkce může porovnávat cokoli, co ze dvou prvků zjistí. Tahle seřadí názvy plodin od nejkratšího:
local plodiny = {"oves", "brambory", "mrkev", "cibule", "okurka", "fazole"}
table.sort(plodiny, function(a, b)
return #a < #b
end)
print(table.concat(plodiny, " "))Vypíše:
oves mrkev okurka cibule fazole brambory(Plodiny v tomto cvičení jsou schválně bez háčků a čárek: # počítá bajty a písmeno s diakritikou má 2 bajty, takže #"dýně" je 6.) Podívejte se na tři názvy o 6 písmenech: okurka cibule fazole. Nejsou ani v původním pořadí, ani podle abecedy. Když funkce řekne, že ani jeden ze dvou prvků nemá být první, table.sort je smí dát v libovolném pořadí. Když vám na pořadí takových prvků záleží, přidejte pro ně druhé pravidlo, třeba abecedu pro názvy stejné délky:
local plodiny = {"oves", "brambory", "mrkev", "cibule", "okurka", "fazole"}
table.sort(plodiny, function(a, b)
if #a ~= #b then
return #a < #b
end
return a < b
end)
print(table.concat(plodiny, " "))Vypíše:
oves mrkev cibule fazole okurka bramboryKdyž se délky liší, rozhodne první return podle délky. Jen při stejné délce se funkce dostane k druhému return, který porovná samotné texty.
Pro porovnávací funkce platí jedno pravidlo: pro dva stejné prvky musí vrátit false, protože „a je před b“ nemůže platit oběma směry. S >= místo > by každé ze dvou stejných čísel mělo být před tím druhým a table.sort může skončit chybou:
local vejce = {5, 3, 5, 1}
table.sort(vejce, function(a, b)
return a >= b
end)
print(table.concat(vejce, " "))Program skončí chybou:
main.lua:2: invalid order function for sortingHláška říká, že porovnávací funkce není platná (invalid order function). Porovnávejte proto pomocí < nebo >, nikdy pomocí <= nebo >=.
Jak psát:
Pokyny
Seznam vahy obsahuje váhu každého koše sklizně v kilogramech. Seřaďte ho od nejtěžšího po nejlehčí a vypište ho spojený mezerami. Program vypíše 23 17 14 9 5.
Seřaďte plodiny od nejdelšího názvu po nejkratší a názvy stejné délky podle abecedy. Vypište je spojené mezerami:
brambory paprika cibule fazole jahody mrkev ovesEminy záhony leží podél cesty a čísla v zahony jsou jejich pozice. Studna je na pozici studna. Ema nosí vodu v kbelících, a tak chce nejdřív zalít záhony nejblíž studně. Seřaďte zahony podle vzdálenosti od studny, což je math.abs(zahon - studna). Při stejné vzdálenosti je dřív menší pozice. Výsledek vypište spojený mezerami:
8 12 6 14 3 18Začněte programovat zdarma
8/11