X) 03 Eine Bestellung aufnehmen
Nach Ihrer äußerst erfolgreichen Eröffnung kehrt nun langsam Normalbetrieb in Ihre Wirtschaft ein. Dazu gehört natürlich auch, dass Sie Bestellungen aus Ihrer Speisekarte von Gästen entgegennehmen. Das üben wir heute einmal.
Altlasten über Bord werfen
Sie wollen natürlich nicht jeden Tag Ihr Gasthaus aufs neue eröffnen und eine Freibier-Party geben (allerdings zum Bedauern Ihrer Gäste). Deshalb gilt es Altlasten über Bord zu werfen! Löschen Sie alles innerhalb der Main-Methode Ihrer Wirtschafts-Klasse, so dass lediglich das hier übrig bleibt:
package de.jbb.wirtschaft; public class Wirtschaft { public static void main(String[] args) { } }
Wenn Sie möchten, können Sie natürlich den bisherigen Code unter einem anderen Namen, an einem anderen Ort oder in einer anderen Klasse abspeichern.
Die Speisekarte
Selbstverständlich benötigen Sie erstmal eine Speisekarte, bevor Ihre Gäste etwas bestellen können. Dies realisieren wir mit Arrays.
Natürlich würde es auch bessere Möglichkeiten geben, aber diese lernen Sie erst später im Java Blog Buch kennen.
Wir erstellen zwei Arrays. Ein String
-Array, welches die verfügbaren Speisen speichert und ein ebenso langes int
-Array, welches den aktuellen Bestand speichert. Dabei speichert Element x im int
-Array den aktuellen Bestand von der Speise des Elements x unseres String
-Arrays. Zu Gunsten der Übersichtlichkeit beschränken wir uns auf vier Getränke, vier Speisen und eine Nachspeise.
String[] speisekarte = {"Bier", "Wein", "Cola", "Wasser", "Schnitzel", "Salat", "Weisswuerste", "Bretzel", "Eis"}; int[] bestand = {50, 30, 70, 75, 20, 30, 40, 40, 25};
Lassen Sie uns anschließend den aktuellen Bestand überprüfen:
System.out.println("Aktueller Bestand:"); for (int i = 0; i < speisekarte.length; i++) { System.out.println(bestand[i] + " " + speisekarte[i]); }[/sourcecode] <strong>Die Bestellung</strong> Das schaut doch ganz gut aus! Jetzt sind Sie bereit Ihre erste Bestellung entgegen zu nehmen. Der Einfachheit halber nehmen wir an, dass der Gast immer zuerst die Anzahl und anschließend die gewünschte Speise aus der Karte nennt. [sourcecode language="java"]String bestellung = "Ich haette gerne fuer mich und meine 3 koepfige Familie " + "1 Bier und 3 Cola zu trinken, 1 Salat als Vorspeise, " + "3 Schnitzel und 4 Weisswuerste als Hauptgericht, und " + "1 Eis fuer unseren Kleinen als Nachspeise!";
Sie haben es richtig erkannt: Um diese Bestellung zu analysieren, brauchen wir einen regulären Ausdruck wie im Kapitel 03.07 Reguläre Ausdrücke beschrieben. Hierzu benötigen wir zuerst den eigentlichen Regex. Dieser muss wie folgt aufgebaut sein:
- Eine beliebige Zahl zwischen 1 und 9, die die Menge angibt –
[1-9]
- Gefolgt von einem Leerzeichen
- Und Abschließend einem Text aus den Zeichen A-Z (ohne Berücksichtigung von Groß- und Kleinschreibung) –
[A-Za-z]*
Dieser reguläre Ausdruck und die Bestellung muss dann wieder den Klassen Pattern
und Matcher
übergeben werden:
String regex = "[1-9] [A-Za-z]*"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(bestellung);
Gehen Sie nun die Bestellung durch:
System.out.println("Die Bestllung lautet: "); while (matcher.find()) { System.out.println(matcher.group()); }
Mit diesem Code werden aber auch noch „Speisen“ ausgegeben, die sich gar nicht auf der Speisekarte befinden. Ich möchte gar nicht wissen, was Ihnen Ihr Küchenchef serviert, wenn Sie Ihm den Wunsch nach „3 köpfige“ mitteilen … Deshalb müssen die Informationen an dieser Stelle nochmal gefiltert werden. Wir gehen hierzu in einer inneren Schleife die Speisekarte durch und überprüfen, ob es sich auch wirklich um eine Speise auf der Karte handelt. Beachten Sie aber, dass sich vor der eigentlichen Speise noch die gewünschte Anzahl befindet, welche wir mit der substring
-Methode abschneiden müssen.
String best = matcher.group(); for (int i = 0; i < speisekarte.length; i++) { if (speisekarte[i].equalsIgnoreCase(best.substring(2))) { System.out.println(best); break; } }[/sourcecode] Als nächsten Schritt wird nach der Bestellung der Bestand angepasst - der Gast isst ja keine Luft. Deshalb benötigen Sie die Bestellzahl der Speise. Für diese Aufgabe bietet sich die Methode <code>Integer.parseInt</code> (wie in Kapitel <a href="http://www.java-blog-buch.de/0306-primitive-datentypen-und-strings/">03.06 Primitive Datentypen und Strings</a> gezeigt) in erneuter Kombination mit der <code>substring</code>-Methode an. Der daraus ermittelten Wert lässt sich dann einfach vom aktuellen Bestand abziehen. [sourcecode language="java"]int anzahl = Integer.parseInt(best.substring(0, 1)); bestand[i] -= anzahl;
Nach der Bestellung sollte der Bestand erneut überprüft werden:
System.out.println(„Aktueller Bestand:“);
for (int i = 0; i < speisekarte.length; i++) {
System.out.println(bestand[i] + " " + speisekarte[i]);
}[/sourcecode]
Auf der nächsten Seite finden Sie den kompletten Quellcode.
Wie geil ist das denn. Danke für dieses super Tutorial – macht wirklich Spaß !