Listen von Datensätzen
Ein Datensatz beschreibt eine Pflanze. Für alle Pflanzen von Emma legst du die Datensätze in eine Liste. Eine Tabelle kann andere Tabellen enthalten, das ist also einfach eine Liste, deren Elemente Datensätze sind:
local pflanzen = {
{name = "Karotte", tage = 3, preis = 5},
{name = "Kartoffel", tage = 4, preis = 8},
{name = "Kürbis", tage = 7, preis = 20},
}
print(#pflanzen)
print(pflanzen[2].name)Das gibt Folgendes aus:
3
KartoffelLies pflanzen[2].name von links nach rechts: Aus pflanzen nimmst du das Element mit dem Index 2 (den Datensatz der Kartoffel), und daraus das Feld name. Alles, was du über Listen weißt, gilt hier: #pflanzen ist die Anzahl der Datensätze, table.insert fügt einen weiteren hinzu, und ipairs geht sie der Reihe nach durch. In jedem Durchlauf enthält die Schleifenvariable einen ganzen Datensatz:
local pflanzen = {
{name = "Karotte", tage = 3, preis = 5},
{name = "Kartoffel", tage = 4, preis = 8},
{name = "Kürbis", tage = 7, preis = 20},
}
for _, pflanze in ipairs(pflanzen) do
print(pflanze.name .. ": " .. pflanze.preis .. " Münzen")
endKarotte: 5 Münzen
Kartoffel: 8 Münzen
Kürbis: 20 MünzenEs ist eine gute Gewohnheit, die Liste im Plural und die Schleifenvariable im Singular zu benennen: pflanzen, pflanze.
Drei Muster kommen bei Listen von Datensätzen ständig vor:
- Summe: Addiere ein Feld jedes Datensatzes, wie in der Lektion über Listen.
- Filtern: Erstelle mit
ifundtable.inserteine neue Liste mit nur einigen der Datensätze (oder einigen ihrer Werte). - Finden: Gehe die Liste durch und gib den ersten passenden Datensatz zurück; passt keiner, gib
nilzurück.
local pflanzen = {
{name = "Karotte", tage = 3, preis = 5},
{name = "Kartoffel", tage = 4, preis = 8},
{name = "Kürbis", tage = 7, preis = 20},
}
local function findePflanze(liste, name)
for _, pflanze in ipairs(liste) do
if pflanze.name == name then
return pflanze
end
end
return nil
end
local function schnellePflanzen(liste)
local ergebnis = {}
for _, pflanze in ipairs(liste) do
if pflanze.tage <= 4 then
table.insert(ergebnis, pflanze.name)
end
end
return ergebnis
end
print(findePflanze(pflanzen, "Kürbis").preis)
print(findePflanze(pflanzen, "Mais"))
print(table.concat(schnellePflanzen(pflanzen), ", "))Das gibt Folgendes aus:
20
nil
Karotte, KartoffelDas return in der Schleife beendet die ganze Funktion, sobald die Pflanze gefunden ist. Das return nil am Ende wird nur erreicht, wenn kein Datensatz gepasst hat. (Eine Funktion ohne return gibt auch nil zurück, aber so ist klar, was du gemeint hast.)
Wenn du Pflanzen oft nach Namen suchst, kannst du einmal ein Dictionary aufbauen: in einer Schleife nachName[pflanze.name] = pflanze. Dann findet nachName["Kürbis"] den Datensatz ohne Schleife.
Eine Liste von Datensätzen lässt sich mit einer Vergleichsfunktion sortieren, wie in der Lektion über Funktionen: table.sort(pflanzen, function(a, b) return a.preis > b.preis end) stellt die teuerste Pflanze an den Anfang. Ohne die Funktion endet table.sort(pflanzen) mit attempt to compare two table values: Lua kann nicht wissen, welcher von zwei Datensätzen zuerst kommen soll.
Ein typischer Fehler ist, den Index zu vergessen: pflanzen.name ist nil. Die Liste selbst hat keinen Namen, nur die Datensätze darin. Wähle zuerst einen Datensatz: pflanzen[1].name.
So schreibst du es:
Anweisungen
- 1
Gib mit
ipairsjeden Verkauf aus: die Pflanze, die Menge, den Preis eines Stücks und was der Verkauf eingebracht hat:Karotten: 6 x 5 = 30 Kürbis: 2 x 20 = 40 Kartoffeln: 10 x 8 = 80 Erdbeeren: 4 x 12 = 48 Weizen: 9 x 3 = 27 - 2
Addiere darunter, was alle Verkäufe eingebracht haben, und gib aus:
Summe: 225 Münzen - 3
Schreibe eine Funktion
grosseVerkaeufe(liste, minimum), die eine neue Liste mit den Namen der Pflanzen zurückgibt, deren Verkauf mindestensminimumMünzen eingebracht hat. Gib ihr Ergebnis für 40 Münzen mittable.concataus:Kürbis, Kartoffeln, Erdbeeren