Folien



(letzte Synchronisation der PDF-Präsentation: 02.08.2017)

Falls keine PDF-Präsentation zu sehen ist, klicken Sie zum Download hier: Direktdownload PDF-Präsentation

Listen sind ein Teil des Collections-Frameworks. ArrayList ist eine Bibliotheksklasse aus dem Paket java.util.* und muss importiert werden.

ArrayList und LinkedList sind im Wesentlichen gleich; die ArrayList ist schneller bei Zugriff auf einzelne Elemente, die LinkedList ist schneller bei Operationen wie löschen, hinzufügen.

Der wesentliche Unterschied zwischen Arrays und der ArrayList: Die ArrayList ist dynamisch, d.h. in der Größe flexibel. In gewissen Kontexten sind Arrays perfomarmenter, im Schulunterricht können wir jedoch immer ArrayList benutzen.

ArrayList: Syntax

In Spitzklammern wird der Datentyp, den die Liste enthält, angegeben:

Java-Code
  ArrayList<String> eineListe = new ArrayList<String>();  

Die ArrayList kann keine primitiven Datentypen (int ...) verwalten, sondern nur Objekte. Möchte man primitive Datentypen in einer ArrayList speichern, muss man Wrapperklassen benutzen:

Java-Code
  ArrayList<Integer> eineListe = new ArrayList<Integer>();  

Wichtige Methoden 1

Wir gehen von dieser Liste aus:

Java-Code
  ArrayList<String> liste = new ArrayList<String>();  

Element ausgeben

liste.get(13)

Element einfügen (ohne Positionsangabe)

liste.add("Heinrich")

Element einfügen (mit Positionsangabe)

liste.add(0, "Heinrich")

Element ändern

liste.set(0, "Heini")

Element entfernen

liste.remove("Heinrich")

liste.remove(1) // Index

Größe zurückgeben

liste.size();

Sie können jetzt unten Aufgabe 1 ("Java_30-ArrayList-1: Lieblingsfächer") bearbeiten.

Wichtige Methoden 2

Wieder gehen wir von dieser Liste aus:

Java-Code
  ArrayList<String> liste = new ArrayList<String>();  

Prüfen, ob Objekt enthalten ist

liste.contains("Heinri")

Welchen Index hat ein Objekt?

liste.indexOf("Heinri")

Liste löschen

liste.clear();

Wenden Sie diese Methoden an in Aufgabe 2 unten ("Java_30-ArrayList-2: Lottozahlen")

Listen ausgeben/durchlaufen

Grundsätzlich gibt es drei Möglichkeiten, die Inhalte einer ArrayList auszugeben:

toString()

Mit toString() wird der Inhalt der ArrayList in einen einzigen String verpackt. Damit kann man natürlich nicht arbeiten, aber ganz hilfreich, um mal rasch in eine ArrayList reinzuschauen:

Java-Code
  ArrayList<Integer> liste = new ArrayList<Integer>(); liste.add(12); liste.add(1000);   System.out.println(liste.toString());  

foreach-Schleife

Wie auch beim Array funktioniert bei der ArrayList eine foreach-Schleife:

Java-Code
  ArrayList<Integer> liste = new ArrayList<Integer>(); liste.add(12); liste.add(1000);   for(int ausgabe : liste) { System.out.println(ausgabe); }  

ListIterator

Der ListIterator durchläuft die ArrayList und bietet zusätzlich einige Methoden zur Verarbeitung:

Java-Code
  ArrayList<Integer> liste = new ArrayList<Integer>(); liste.add(12); liste.add(1000);   ListIterator<Integer> li = liste.listIterator();   while(li.hasNext()) { System.out.println(li.next()); }  

next() springt zum nächsten Element der Liste. Der Index des aktuellen Elements wird mit li.nextIndex() abgefragt.

Üben Sie die Listenausgabe mit Aufgabe 3 unten ("Java_30-ArrayList-3: Listen ausgeben").

Übungen

Alle Übungen finden Sie in der Materialsammlung (dort auch alle zusätzlichen Dateien wie Bilder, Klassendiagramme oder HTML-Vorlagen!).

Die aktuelle Übung können Sie hier als txt-File herunterladen.


***** Übungen: Java - ArrayList *****

Java_30-ArrayList-1a: Lieblingsfächer, ArrayList

Erstellen Sie eine Klasse "Fachverwaltung" wie in diesem Klassendiagramm:
/16java/java31-arrayList-UE1a-klassendiagramm.png

Konstruktor der Klasse:
- Weisen Sie der ArrayList zwei Fächer zu (mit this.lieblingsfaecher.add("Mathe");).
- Geben Sie beide Fächer auf der Konsole aus (keine Schleife verwenden!), etwa so:
»Meine Lieblingsfächer sind:
Mathe
Informatik«




Java_30-ArrayList-1b: Lieblingsfächer, ArrayList mit Getter

Entfernen Sie die Anweisungen im Konstruktor von Übung 1a.

Nun sollen Sie das Gleiche wie in Übung 1a programmieren, allerdings nicht im Konstruktor der Klasse Fachverwaltung, sondern in der Startklasse. Da die Liste private ist, kann die Startklasse nicht darauf zugreifen, Sie müssen also den Getter verwenden.




Java_30-ArrayList-1c: Lieblingsfächer mit foreach-Schleife

Nehmen Sie Übung 1b und lassen Sie sich die Lieblingsfächer mit einer foreach-Schleife ausgeben.

Erstellen Sie ein Struktogramm für die foreach-Schleife!





Java_30-ArrayList-1d: Lieblingsfächer mit foreach-Schleife und Klasse »Fach«

Gleiche Übung wie 1c, aber diesmal wird eine Klasse "Fach" angelegt; die ArrayList speichert Objekte der Klasse Fach.
Klassendiagramm hier:
/16java/java31-arrayList-UE1d-klassendiagramm.png

Sie regeln das alles erst mal über die Startklasse (neues Objekt Faecherverwaltung; 3 neue Fach-Objekte; Zuordnung der 3 Fächer zum Faecherverwaltungsobjekt; Ausgabe aller Fächer über foreach-Schleife).




Java_30-ArrayList-1e: Lieblingsfächer, komplett

Sie können die Übung 1d erweitern (auch die Startklasse erst mal lassen, siehe dieses Klassendiagramm:
/16java/java31-arrayList-UE1e-klassendiagramm.png

Hinweis zur Methode alleFaecherAusgeben() - Ausgabe wie oben
Hinweis zur Methode getAlleFaecherAlsString():String - In dieser Methode müssen Sie einen String nicht ausgeben, sondern "zusammenbauen", da schließlich nur ein String zurückgegeben wird.
Hinweis zur Methode notendurchschnittDerFaecherBerechnen():double - Erstellen Sie ein Struktogramm für diese Methode, BEVOR Sie sie programmieren!

In der Startklasse legen Sie ein Objekt der Klasse Faecherverwaltung (Name des Objekts z.B. fw) an, 3 neue Objekte der Klasse Fach und weisen die Fächer dem Objekt fw zu.
Dann probieren Sie die Methoden aus, z.B. fw(alleFaecherAusgeben) oder System.out.println(fw.getAlleFaecherAlsString()) oder System.out.println("Der Notenschnitt ist: " + fw.notendurchschnittDerFaecherBerechnen())





Java_30-ArrayList-2: Lottozahlen

Die Lottozahlen vom Samstag waren 1,17,25,30,31,33. Speichern Sie sie in einer ArrayList "lottozahlen".
Prüfen Sie, ob sich die Zahl 12 in der Liste befindet. Prüfen Sie, ob sich die Zahl 31 in der Liste befindet.
Lassen Sie sich die Länge der Liste ausgeben (es müsste 6 herauskommen).
Angenommen, Sie würden diesen Befehl eingeben:

lottozahlen.remove(1);

Was glauben Sie: Welche Zahl würde entfernt werden?

Probieren Sie es aus, NACHDEM Sie Ihre Vermutung angestellt haben.

(Lösung: lottozahlen.remove((Integer)1);)




Java_30-ArrayList-3: Listen ausgeben

Erstellen Sie mit einer for-Schleife eine ArrayList, die die Zahlen 10, 20, 30 ... bis 1000 enthält.
Lassen Sie sich alle Elemente ausgeben,
- einmal mit einer foreach-Schleife,
- einmal mit dem ListIterator





Java_30-ArrayList-4: ArrayList mit Objekten: Tierheim (schwierig)

1) Programmieren Sie die Klassen "Tier" und "Tierart" wie im Klassendiagramm
/16java/java31-arrayList_bild_Tiere.png

Die Methode alleDatenAusgeben() in der Klasse Tierart erzeugt eine Konsolenausgabe in Form von:
"Tierart: Hund, Anzahl Beine: 4"

2) Erzeugen Sie in der Startklasse drei Tierarten und einige Tiere (z.B. 2 Hunde, 3 Spinnen, 2 Fische).

3) Erzeugen Sie in der Startklasse eine (lokale!) ArrayList namens tierheim, die Objekte der Klasse Tier aufnehmen kann. Fügen Sie die Tiere, die Sie angelegt haben, in die Liste ein.

4) Lassen Sie sich zur Kontrolle die Länge der ArrayList ausgeben (mit size()).

5) Lassen Sie sich den Namen und die Anzahl der Beine des Tiers mit Index 0 ausgeben (ArrayList-Methode get(...)).

6) Durchlaufen Sie die tierheim-Liste mit einer foreach-Schleife und lassen Sie für alle Tiere den Namen und die Spezifikationen der Tierart (alleDatenAusgeben()) ausgeben.
Ergänzungsaufgabe zu 6) Tipp: Verwenden Sie hier die ListIterator-Methode nextIndex(); diese gibt Ihnen den Indexwert des aktuellen Elements zurück. Vergessen Sie nicht, am Ende der while-Schleife die ListIterator-Methode next() zu verwenden.

7) Lassen Sie sich in einer Schleife die Daten aller Tiere _nur einer Tierart_ ausgeben (also bspw. alle Hunde). Sie können diese Aufgabe kurz halten, indem Sie Aufgabe 6 aufbohren.




Java_30_ArrayList-5: ArrayList-Methoden verwenden

Gegeben sei eine ArrayList<String> mit dem Bezeichnernamen besucherListe. Wie lautet der vollständige Befehl, …
a) … um ein Element mit dem Wert "Hugo" einzufügen?
Antwort

b) … um ein Element mit dem Wert "Hugo" an Position 0 einzufügen?
Antwort

c) … um direkt nach b) das Element mit dem Wert "Hugo" zu löschen?
Antwort

d) … um herauszufinden, welchen Index das Element mit dem Wert "Hugo" hat?
Antwort

e) … um herauszufinden, ob sich ein Element mit dem Wert "Hugo" in der Liste befindet?
Antwort