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)
end

Vypíše například:

jahody: 4
mrkev: 12
brambory: 30

Proč „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: 46

Když 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])
end

Vypíše pokaždé stejné řádky ve stejném pořadí:

brambory: 30
jahody: 4
mrkev: 12

Jak 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ísto pairs(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 do skončí chybou attempt to call a table value (for iterator 'for iterator').
  • Přidávání nových klíčů do tabulky, kterou zrovna pairs prochází. Měnit nebo odebírat klíče, které vám cyklus dává, můžete, ale nové v cyklu nepřidávejte.

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: 30

Pod to spočítejte, kolik druhů plodin ve stodole je, a sečtěte všechny kusy. Vypište:

Druhů: 4
Celkem: 96

Nakonec 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: 50

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

4/10