Sortieren mit einer Funktion
In der Lektion über Listen hat table.sort(t) Zahlen von der kleinsten an und Texte nach ihren Zeichencodes sortiert. Das liegt daran, dass table.sort die Elemente mit < vergleicht. Um sie anders zu sortieren, gibst du ihm ein zweites Argument: eine Funktion, die zwei Elemente vergleicht. table.sort ruft sie immer wieder mit zwei Elementen auf, a und b, und die Funktion gibt true zurück, wenn a vor b stehen soll:
local ernte = {12, 30, 7, 45, 18}
table.sort(ernte, function(a, b)
return a > b
end)
print(table.concat(ernte, " "))Das gibt Folgendes aus:
45 30 18 12 7„a steht zuerst, wenn es größer ist“ ergibt eine Liste von der größten zur kleinsten Zahl. Die Funktion ist anonym und direkt in den Aufruf geschrieben, wie in der vorigen Übung, deshalb schließt end) sowohl die Funktion als auch den Aufruf. Brauchst du dieselbe Reihenfolge an mehreren Stellen, gib der Funktion einen Namen und übergib den Namen: table.sort(ernte, groessteZuerst).
Die Funktion kann alles vergleichen, was sich aus den beiden Elementen ergibt. Diese sortiert Pflanzennamen vom kürzesten an:
local pflanzen = {"Kartoffel", "Tomate", "Gurke", "Bohnen", "Weizen", "Mais"}
table.sort(pflanzen, function(a, b)
return #a < #b
end)
print(table.concat(pflanzen, " "))Das gibt Folgendes aus:
Mais Gurke Weizen Tomate Bohnen KartoffelSieh dir die drei Namen mit 6 Buchstaben an: Weizen Tomate Bohnen. Sie stehen weder in ihrer ursprünglichen Reihenfolge noch in alphabetischer. Wenn die Funktion sagt, dass keines von zwei Elementen zuerst kommt, darf table.sort sie in beliebiger Reihenfolge anordnen. Wenn dir die Reihenfolge solcher Elemente wichtig ist, füge eine zweite Regel für sie hinzu, zum Beispiel alphabetische Reihenfolge für Namen derselben Länge:
local pflanzen = {"Kartoffel", "Tomate", "Gurke", "Bohnen", "Weizen", "Mais"}
table.sort(pflanzen, function(a, b)
if #a ~= #b then
return #a < #b
end
return a < b
end)
print(table.concat(pflanzen, " "))Das gibt Folgendes aus:
Mais Gurke Bohnen Tomate Weizen KartoffelUnterscheiden sich die Längen, entscheidet das erste return nach der Länge. Nur bei gleicher Länge kommt die Funktion zum zweiten return, das die Texte selbst vergleicht.
Eine Regel für Vergleichsfunktionen: Bei zwei gleichen Elementen muss die Funktion false zurückgeben, denn „a steht vor b“ kann nicht in beide Richtungen wahr sein. Mit >= statt > würde jede von zwei gleichen Zahlen vor der anderen stehen, und table.sort kann mit einem Fehler enden:
local eier = {5, 3, 5, 1}
table.sort(eier, function(a, b)
return a >= b
end)
print(table.concat(eier, " "))Das Programm endet mit einem Fehler:
main.lua:2: invalid order function for sortingDie Meldung sagt, dass die Vergleichsfunktion nicht gültig ist. Vergleiche also mit < oder >, nie mit <= oder >=.
So schreibst du es:
Anweisungen
- 1
Die Liste
gewichteenthält das Gewicht jedes Korbs der Ernte in Kilogramm. Sortiere sie vom schwersten zum leichtesten und gib sie mit Leerzeichen verbunden aus. Das Programm gibt23 17 14 9 5aus. - 2
Sortiere
pflanzenvom längsten Namen zum kürzesten, und Namen derselben Länge alphabetisch. Gib sie mit Leerzeichen verbunden aus:Kartoffel Erdbeere Karotte Bohnen Tomate Weizen Mais - 3
Emmas Beete liegen an einem Weg, und die Zahlen in
beetesind ihre Positionen. Der Brunnen steht an der Positionbrunnen. Emma trägt das Wasser in Eimern, deshalb will sie die Beete, die dem Brunnen am nächsten sind, zuerst gießen. Sortierebeetenach ihrem Abstand vom Brunnen, dermath.abs(beet - brunnen)ist. Bei gleichem Abstand kommt die kleinere Position zuerst. Gib das Ergebnis mit Leerzeichen verbunden aus:8 12 6 14 3 18