Schleifen mit pairs
ipairs geht eine Liste durch: 1, 2, 3 … bis zur ersten fehlenden Zahl. Schlüssel wie Karotten sieht es nicht. Um jeden Schlüssel einer Tabelle durchzugehen, benutze pairs. In jedem Durchlauf der Schleife gibt es dir einen Schlüssel und seinen Wert:
local scheune = {Karotten = 12, Kartoffeln = 30, Zucchini = 4}
for pflanze, anzahl in pairs(scheune) do
print(pflanze .. ": " .. anzahl)
endDas gibt zum Beispiel Folgendes aus:
Kartoffeln: 30
Zucchini: 4
Karotten: 12Warum „zum Beispiel“? Weil die Reihenfolge von pairs nicht festgelegt ist. Lua speichert die Schlüssel so, dass es jeden schnell finden kann, nicht in der Reihenfolge, in der du sie geschrieben hast. Auf keine Reihenfolge kannst du dich verlassen: nicht auf die in deinem Code, nicht auf die alphabetische. Auf dieser Seite kann die Reihenfolge sogar bei jedem Klick auf Ausführen anders sein; probiere es ein paarmal aus. In einem größeren Programm kann sie sich auch ändern, wenn Schlüssel hinzukommen oder wegfallen.
Für viele Aufgaben spielt die Reihenfolge keine Rolle: Werte addieren, Schlüssel zählen, den größten Wert finden. Weißt du noch, dass # die Schlüssel eines Dictionarys nicht zählt? Eine Schleife tut es:
local scheune = {Karotten = 12, Kartoffeln = 30, Zucchini = 4}
local sorten = 0
local summe = 0
for pflanze, anzahl in pairs(scheune) do
sorten = sorten + 1
summe = summe + anzahl
end
print("Sorten: " .. sorten)
print("Summe: " .. summe)Sorten: 3
Summe: 46Wenn die Reihenfolge wichtig ist, zum Beispiel wenn du die Scheune für Emma ausgibst, sortiere zuerst die Schlüssel. Sammle sie in einer Liste, sortiere sie mit table.sort und gehe die sortierte Liste mit ipairs durch; die Werte liest du über ihre Schlüssel aus dem Dictionary. Mit nur einer Variable nach for gibt pairs dir nur die Schlüssel:
local scheune = {Kartoffeln = 30, Zucchini = 4, Karotten = 12}
local pflanzen = {}
for pflanze in pairs(scheune) do
table.insert(pflanzen, pflanze)
end
table.sort(pflanzen)
for _, pflanze in ipairs(pflanzen) do
print(pflanze .. ": " .. scheune[pflanze])
endDas gibt dieselben Zeilen jedes Mal in derselben Reihenfolge aus:
Karotten: 12
Kartoffeln: 30
Zucchini: 4Mit einer Vergleichsfunktion aus der Lektion über Funktionen kannst du stattdessen nach den Werten sortieren: table.sort(pflanzen, function(a, b) return scheune[a] > scheune[b] end) stellt die Pflanze mit den meisten Stücken an den Anfang.
pairs funktioniert auch bei Listen (ihre Schlüssel sind 1, 2, 3 …), verspricht aber nicht, der Reihe nach zu gehen. Bei Listen benutze ipairs.
Typische Fehler:
ipairs(scheune)stattpairs(scheune): Die Tabelle hat keinen Schlüssel1, also läuft die Schleife null Mal. Es wird nichts ausgegeben und es gibt keinen Fehler, achte also darauf.pairsvergessen:for pflanze, anzahl in scheune doendet mitattempt to call a table value (for iterator 'for iterator').- Neue Schlüssel zur Tabelle hinzufügen, während
pairssie durchgeht. Die Schlüssel zu ändern oder zu entfernen, die die Schleife dir gibt, ist in Ordnung, aber füge in der Schleife keine neuen hinzu.
So schreibst du es:
Anweisungen
- 1
Gib mit einer
for-Schleife undpairsjede Pflanze in der Scheune mit ihrer Anzahl aus. Die Zeilen dürfen in beliebiger Reihenfolge kommen, zum Beispiel:Weizen: 50 Karotten: 12 Zucchini: 4 Kartoffeln: 30 - 2
Zähle darunter die Sorten in der Scheune und addiere alle Stücke. Gib aus:
Sorten: 4 Summe: 96 - 3
Gib zum Schluss
Sortiert:aus und darunter die Pflanzen noch einmal, diesmal alphabetisch sortiert:Sortiert: Karotten: 12 Kartoffeln: 30 Weizen: 50 Zucchini: 4