ArrayList
Wie ich gehört habe, konntest du Giovanni mit seiner Speisekarte helfen!
Ich befürchte, du musst noch mal ran – Giovanni hat mir gerade von seiner neuesten Kreation erzählt: Avocado mit Pistazienstplittern! Und er plant noch weitere…
Wenn du die SimpleSpeisekarte
weiterschreiben möchtest, schon. Aber ich habe einen Tipp für dich! Eine neue Datenstruktur!
Eine Datenstruktur ist die Art und Weise, wie wir Daten organisieren. Auf einer höheren Ebene hast du dann ein Objekt, das die Daten, die dich interessieren, zusammenfasst.
Stell’ dir vor, du hast einige Spielkarten – das sind unsere Daten. Eine Datenstruktur wäre dann so etwas wie z.B. ein Stapel oder eine Reihe von Karten. Vom Stapel kannst du (ohne den Stapel zu zerstören) nur die oberste Karte wegnehmen, auf Karten, die in einer Reihe liegen, hast du direkten Zugriff.
Ich wage es gar nicht zu sagen…
Eine Liste! Du wirst heute lernen, wie du in einem Programm Daten einer Liste hinzufügen kannst, und wie wir diese Daten auf unkomplizierte Weise auslesen können. Startklar?
Sehr schön! Ich zeige dir, wie du eine Liste in Java anlegen kannst, und wie du ihr Daten hinzufügen kannst.
Lass uns zum Testen einen Einkaufszettel schreiben. Lege eine neue Datei in der Online-IDE an, und füge ihr diese Zeile hinzu:
ArrayList<String> einkauf;
Der Liste, die wir anlegen, liegt ein sogenanntes Array zu Grunde. (Was das genau ist, werden wir später noch behandeln.) Wichtig ist nur, dass dieses Array nicht angelegt werden kann, ohne zu wissen, welcher Typ von Daten enthalten sein soll – nur so kann der Speicherplatz richtig reserviert werden.
Langer Rede, kurzer Sinn: in den spitzen Klammern übergeben wir den Datentyp.
Nicht ganz. Bis dahin ist die Liste nur deklariert. Um ein Listenobjekt zu erzeugen, müssen wir den Konstruktor aufrufen. Erweitere die Zeile so:
ArrayList<String> einkauf = new ArrayList<>();
Dafür lässt sich die add
-Methode aufrufen. Das geht so:
einkauf.add("Salat");
einkauf.add("Tofu");
einkauf.add("Eier");
Du kannst das Programm jetzt schon Schritt für Schritt laufen lassen (Taste F6) und zusehen, wie deine Liste angelegt und erweitert wird.
Weil in unserer Liste nur Zeichenketten enthalten sind, können wir sie einfach so ausgeben:
println(einkauf);
Nicht ganz. Wenn der Datentyp nicht einfach so ausgegeben werden kann, werden die Objekttypen und manchmal eine Speicheradresse ausgegeben. Das hilft oft nicht viel…
Es gibt eine einfache Möglichkeit, mit einer for
-Wiederholung alle Elemente der Liste nacheinander aufzurufen. Die sieht so aus:
for (String s : einkauf) {
println(s);
}
Erkennst du so eine for
-Wiederholung wieder?
Das stimmt! Du siehst eine erweiterte for-Wiederholung – damit werden alle Elemente einer Liste durchgegangen.
Das s
ist nur eine Name – du könntest auch einen anderen wählen. Diesen Namen bekommt die Variable, die bei jeder Wiederholung neu zugewiesen wird, und auf die du zugreifen kannst. Auf diese Weise kann jedes Listenelement der Reihe nach bearbeitet werden.
Lass das Programm nun einmal laufen. Bemerkst du den Unterschied zur Ausgabe mit println
?
Die Darstellung mit den eckigen Klammern ist eine Darstellung der Liste selbst. Bei der anderen Darstellung sorgt println
jedes Mal dafür, dass am Ende ein Zeilenumbruch hinzugefügt wird.
Hast Du das verstanden, oder brauchst du ein weiteres Beispiel?
In Ordnung. Hier kommt noch ein Beispiel dafür, wie Listenelemente bearbeitet werden können. Wenn du an einer Zeichenkette die Methode toLowerCase()
aufrufst, bekommst du sie in Kleinbuchstaben zurück. (Das wird oft für Vergleiche eingesetzt, wenn man sicherstellen möchte, dass die Groß- und Kleinschreibung egal ist.)
Verändere den Code einmal auf diese Weise:
for (String s : einkauf) {
println(s.toLowerCase());
}
Was wird wohl ausgegeben werden?
Hast du nicht den Unterschied bemerkt? Die println
-Funktion gibt nun das in Kleinbuchstaben geschriebene Wort aus!
So arbeitet toLowerCase()
nicht – die Großbuchstaben werden in Kleinbuchstaben umgewandelt.
So ist es. Gut mitgedacht!
Ich hoffe, du konntest sehen, auf welche Weise du mit den Elementen einer Liste in einer erweiterten for
-Wiederholung arbeiten kann.
Dann ist jetzt Zeit, dein neues Wissen einzusetzen!
Hilf Giovanni noch einmal, eine neue, zukunftssicherere Speisekarte zu programmieren, die auch dann noch funktioniert, wenn er die nächsten Sorten erfindet.
Gut! Stelle sicher, dass du folgende Klassen/Dateien in einem neuen Workspace hast:
// in einer Datei Eisbecher.java
public class Eisbecher {
private String sorte; // z.B. Zitrone
private String topping;
private double preis;
// Konstruktor
public Eisbecher(String sorte) {
this.sorte = sorte;
this.topping = "Schokostreusel";
this.preis = 3.20;
}
// falls andere Toppings gewünscht (z.B. Zuckerkugeln)
public void setTopping(String topping) {
this.topping = topping;
}
public String speisekarteneintrag() {
return sorte + "-Eisbecher mit " + this.topping + ": " + preis;
}
}
Erinnerst du dich an die Eisbecher
-Klasse?
Dann brauchst du auch eine Start-Datei:
Eisbecher e = new Eisbecher("Melone");
e.setTopping("Maracuja");
Eisbecher f = new Eisbecher("Pfefferminze");
f.setTopping("Zartbitterschokoladenstreusel");
Eisbecher g = new Eisbecher("Avocado");
g.setTopping("Pistazienstplitter");
Speisekarte karte = new Speisekarte();
karte.eisbecherHinzufügen(e);
karte.eisbecherHinzufügen(f);
karte.eisbecherHinzufügen(g);
karte.speisekarteDrucken();
Die neue Sorte ist hier schon enthalten – wenn alle Sorten ausgegeben werden, hast du den Job erledigt!
Nun ja, es könnten weitere Sorten kommen… stelle also sicher, dass du eine ArrayList
in deiner Klasse Speisekarte
verwendest, damit Giovanni beliebig viele neue Sorten hinzufügen kann!
Hier ist einmal das Gerüst zur Klasse Speisekarte
:
public class Speisekarte {
// Hier fehlt eine ArrayList, die du benennen darfst
public void eisbecherHinzufügen(Eisbecher eis) {
// Hier sollst du der Liste Eisbecher hinzufügen
}
public void speisekarteDrucken() {
// Hier soll jedes Element der Liste ausgegeben werden
// (Gemeint ist der speisekarteneintrag)
}
}
Wenn du die die ArrayList
als Instanzvariable festgelegt hast, brauchst du nur noch die Methoden mit Leben füllen.
Geschafft?
Du kannst jetzt natürlich keine Zeichenketten-Liste nehmen, weil du ja Eisbecher abspeichern musst. Eisbecher
ist hier der gefragte Typ – also schreiben wir den zwischen die spitzen Klammern:
public class Speisekarte {
// Hier die ArrayList vom Typ <Eisbecher>
ArrayList<Eisbecher> eise = new ArrayList<>();
public void eisbecherHinzufügen(Eisbecher eis) {
// Hier sollst du der Liste Eisbecher hinzufügen
}
public void speisekarteDrucken() {
// Hier soll jedes Element der Liste ausgegben werden
// (Gemeint ist der speisekarteneintrag)
}
}
Kommst du mit der eisbecherHinzufügen
-Methode alleine klar?
Hier muss ja das Eis, das übergeben wird, in der Liste abgespeichert werden. Das funktioniert mit der add
-Methode:
public void eisbecherHinzufügen(Eisbecher eis) {
// eis wird der Liste hinzugefügt
this.eise.add(eis);
}
Diese eine Zeile reicht schon – schön, oder?
Weißt du, wie du in der speisekarteDrucken
-Methode alle Eisbecher ausgeben lassen kannst?
Du musst nicht, aber sie bietet sich natürlich an… In der erweiterten for
-Wiederholung rufen wir an jedem Eisbecher die Methode speisekarteneintrag()
auf, und geben diesen aus. Das sieht dann so aus:
public void speisekarteDrucken() {
// Jedes Element aufrufen und ausgeben
for (Eisbecher e : this.eise) {
println(e.speisekarteneintrag());
}
}
Damit sollte es funktionieren!
Sehr schön! Probiere die neue Klasse aus. Vielleicht magst du selbst auch noch einige Eissorten erfinden und heimlich auf Giovannis Karte unterbringen? Sag ihm nur nicht, dass du diese Idee von mir hattest…
Jetzt hast du eine Menge gelernt, herzlichen Glückwunsch!
Diese Dinge solltest du dir merken. Schreibe sie in dein Heft – vielleicht möchtest du sie auch auf Karteikarten übertragen und wie Vokabeln lernen? So wirst du sie besser im Gedächtnis behalten können…
Neue Vokabeln in dieser Lektion
Schreibe den entsprechenden Code auf, und überprüfe, ob du richtig liegst!
Eine Liste von Zeichenketten (Strings) neu anlegen und der Variable meineListe
zuweisen
ArrayList<String> meineListe = new ArrayList<>();
Der Liste meineListe
die Zeichenkette “Katzenfutter” hinzufügen
meineListe.add("Katzenfutter");
Alle Elemente einer Liste meineListe
aus Zeichenketten durchlaufen
for (String s : meineListe) {
// weiterer Code
}