Zählen mit einer Tabelle
Dictionaries eignen sich hervorragend zum Zählen. Emma hat das Wetter jedes Tages dieser Woche aufgeschrieben, und sie will wissen, wie viele Tage sonnig, regnerisch und wolkig waren. Erstelle ein Dictionary, dessen Schlüssel die Wetterarten und dessen Werte die Anzahlen der Tage sind. Beginne mit einer leeren Tabelle und gehe die Liste durch; zähle für jeden Tag 1 zur Anzahl seiner Wetterart hinzu:
local wetter = {"sonnig", "regnerisch", "sonnig", "wolkig", "sonnig", "regnerisch", "sonnig"}
local tage = {}
for _, w in ipairs(wetter) do
tage[w] = (tage[w] or 0) + 1
end
print("Sonnig: " .. tage.sonnig)
print("Regnerisch: " .. tage.regnerisch)
print("Wolkig: " .. tage.wolkig)Das gibt Folgendes aus:
Sonnig: 4
Regnerisch: 2
Wolkig: 1Die wichtige Zeile ist tage[w] = (tage[w] or 0) + 1. Verfolge sie durch die ersten drei Tage:
- Am ersten Tag ist
wgleich"sonnig". Es gibt noch keinen Schlüsselsonnig, also isttage[w]gleichnil,nil or 0ist0, undtage.sonnigwird zu1. - Am zweiten Tag ist
wgleich"regnerisch", das es auch noch nicht gibt:tage.regnerischwird zu1. - Am dritten Tag ist es wieder
"sonnig". Jetzt isttage[w]gleich1,1 or 0ist1, undtage.sonnigwird zu2.
Du musst nicht im Voraus wissen, welche Wetterarten es gibt. Eine neue bekommt ihren eigenen Schlüssel, sobald sie zum ersten Mal vorkommt.
Zwei typische Fehler:
- Ohne
or 0:tage[w] = tage[w] + 1endet schon am ersten Tag mitattempt to perform arithmetic on a nil value (field '?'), weil es noch keine Zahl gibt, zu der man 1 addieren könnte. - Ohne die Klammern:
tage[w] = tage[w] or 0 + 1. Es gibt keinen Fehler, aber+geht voror, also berechnet Luatage[w] or 1, und jede Wetterart bleibt bei 1.
Dasselbe Muster addiert Mengen, statt zu zählen: summen[pflanze] = (summen[pflanze] or 0) + menge.
Um herauszufinden, was am häufigsten vorkam, gehe die Anzahlen mit pairs durch und benutze das Muster für den größten Wert aus der Lektion über Listen. Hier spielt die Reihenfolge von pairs keine Rolle: Egal in welcher Reihenfolge, die größte Zahl ist dieselbe:
local tage = {sonnig = 4, regnerisch = 2, wolkig = 1}
local beste = nil
local besteAnzahl = 0
for w, anzahl in pairs(tage) do
if anzahl > besteAnzahl then
beste = w
besteAnzahl = anzahl
end
end
print("Meiste Tage: " .. beste .. " (" .. besteAnzahl .. ")")Das gibt Folgendes aus:
Meiste Tage: sonnig (4)In der Lektion über Listen hast du die Suche mit dem ersten Element begonnen. Ein Dictionary hat kein erstes Element, aber eine Anzahl ist nie kleiner als 1, deshalb ist es hier sicher, mit 0 zu beginnen. Und nur wenn zwei Wetterarten dieselbe größte Zahl hätten, würde die Reihenfolge entscheiden, welche von beiden ausgegeben wird.
So schreibst du es:
Anweisungen
- 1
Zähle, wie viele Stücke von jeder Pflanze Emma verkauft hat: Erstelle eine leere Tabelle
anzahlenund fülle sie in einer Schleife überverkauft. Gib dann daraus die Anzahlen der Karotten und Erdbeeren aus:Karotten: 4 Erdbeeren: 3 - 2
Finde darunter die Pflanze, die sich am besten verkauft hat: Gehe
anzahlenmitpairsdurch und merke dir die größte Anzahl. Gib aus:Bestseller: Karotten (4)