Procházení pomocí pairs
ipairs prochází seznam: 1, 2, 3… až po první chybějící číslo. Klíče jako mrkev nevidí. Když chcete projít všechny klíče tabulky, použijte pairs. V každém průchodu cyklem vám dá jeden klíč a jeho hodnotu:
local stodola = {mrkev = 12, brambory = 30, jahody = 4}
for plodina, pocet in pairs(stodola) do
print(plodina .. ": " .. pocet)
endVypíše například:
jahody: 4
mrkev: 12
brambory: 30Proč „například“? Protože pořadí pairs není dané. Lua si klíče ukládá tak, aby kterýkoli z nich rychle našla, ne v pořadí, v jakém jste je napsali. Na žádné pořadí se nemůžete spolehnout: ani na to z vašeho kódu, ani na abecední. Na tomto webu se pořadí může změnit dokonce pokaždé, když kliknete na Spustit; zkuste to několikrát. Ve větším programu se může změnit i tehdy, když klíče přidáte nebo odeberete.
U spousty úloh na pořadí nezáleží: když sčítáte hodnoty, počítáte klíče nebo hledáte největší hodnotu. Pamatujete, že # klíče slovníku nepočítá? Cyklus to zvládne:
local stodola = {mrkev = 12, brambory = 30, jahody = 4}
local druhu = 0
local celkem = 0
for plodina, pocet in pairs(stodola) do
druhu = druhu + 1
celkem = celkem + pocet
end
print("Druhů: " .. druhu)
print("Celkem: " .. celkem)Druhů: 3
Celkem: 46Když na pořadí záleží, třeba když Emě vypisujete obsah stodoly, klíče nejdřív seřaďte. Posbírejte je do seznamu, seřaďte ho pomocí table.sort a seřazený seznam projděte pomocí ipairs; hodnoty čtěte ze slovníku podle klíčů. S jedinou proměnnou za for vám pairs dá jen klíče:
local stodola = {mrkev = 12, brambory = 30, jahody = 4}
local plodiny = {}
for plodina in pairs(stodola) do
table.insert(plodiny, plodina)
end
table.sort(plodiny)
for _, plodina in ipairs(plodiny) do
print(plodina .. ": " .. stodola[plodina])
endVypíše pokaždé stejné řádky ve stejném pořadí:
brambory: 30
jahody: 4
mrkev: 12Jak víte z lekce o seznamech, table.sort řadí texty podle kódů znaků, takže slova začínající na Č, Ř nebo Š skončí až za Z. S porovnávací funkcí z lekce o funkcích můžete řadit i podle hodnot: table.sort(plodiny, function(a, b) return stodola[a] > stodola[b] end) dá na začátek plodinu, které je nejvíc.
pairs funguje i na seznamy (jejich klíče jsou 1, 2, 3…), ale nezaručuje, že půjde popořadě. Na seznamy používejte ipairs.
Typické chyby:
ipairs(stodola)místopairs(stodola): tabulka nemá klíč1, a tak cyklus neproběhne ani jednou. Nic se nevypíše a žádná chyba nenastane, takže si na to dávejte pozor.- Zapomenuté
pairs:for plodina, pocet in stodola doskončí chybouattempt to call a table value (for iterator 'for iterator'). - Přidávání nových klíčů do tabulky, kterou zrovna
pairsprochází. Měnit nebo odebírat klíče, které vám cyklus dává, můžete, ale nové v cyklu nepřidávejte.
Jak psát:
Pokyny
Pomocí cyklu for a pairs vypište každou plodinu ve stodole s jejím počtem. Řádky můžou být v libovolném pořadí, například:
pšenice: 50
mrkev: 12
dýně: 4
brambory: 30Pod to spočítejte, kolik druhů plodin ve stodole je, a sečtěte všechny kusy. Vypište:
Druhů: 4
Celkem: 96Nakonec vypište Podle abecedy: a pod to znovu plodiny, tentokrát seřazené podle abecedy:
Podle abecedy:
brambory: 30
dýně: 4
mrkev: 12
pšenice: 50Začněte programovat zdarma
4/10