Mit der Liste arbeiten
Im Abitur benutzt du die Liste über die Methoden aus der Dokumentation. In der Online-IDE steht die Abiturklasse List bereit, sobald ein Block die NRW-Bibliothek lädt.
Anders als bei Schlange und Stapel zerstört das Durchlaufen eine Liste nicht: Man bewegt nur das aktuelle Element weiter. Eine Hilfsstruktur zum Wiederauffüllen braucht man deshalb nicht.
Werkzeugkasten: zwei Muster
Das Durchlaufen beginnt mit toFirst und rückt mit next weiter, bis es kein aktuelles Element mehr gibt.
pListe.toFirst();
while (pListe.hasAccess()) {
String aktuell = pListe.getContent();
// aktuell verarbeiten
pListe.next();
}
Das Entfernen beim Durchlaufen braucht eine Fallunterscheidung: Nach remove ist schon der Nachfolger das aktuelle Element. Ein zusätzliches next würde ihn überspringen.
pListe.toFirst();
while (pListe.hasAccess()) {
if (/* aktuelles Element soll weg */) {
pListe.remove(); // der Nachfolger wird aktuell
} else {
pListe.next();
}
}
Aufgabe 1: Die Methoden verstehen
Beantworte die Fragen ohne Programmierung. Nimm die Dokumentation zu Hilfe.
a) In einer Liste stehen drei Elemente. Welche Methoden ruft man nacheinander auf, um das zweite zu löschen?
b) Welche Methoden ruft man auf, um zwischen dem ersten und dem zweiten Element ein neues einzufügen?
c) In welchen Fällen liefert hasAccess() den Wert false? Nenne alle Fälle.
d) Warum kann man mit insert kein Element am Ende der Liste einfügen? Wie geht es stattdessen?
Aufgabe 2: Alle Vorkommen entfernen
Das Struktogramm beschreibt die Methode entferneAlle. Sie entfernt jedes Vorkommen von pWert aus der Liste.
a) Verfolge das Struktogramm für die Liste Anna, Anna, Ben, Anna und pWert = "Anna". Notiere nach jedem Schleifendurchlauf die Liste und das aktuelle Element.
b) Begründe, warum next() im Sonst-Zweig steht und nicht hinter der Verzweigung.
c) Setze das Struktogramm in der Klasse Listenwerkzeug unten als Methode void entferneAlle(List<String> pListe, String pWert) in Java um. Prüfe mit dem Reiter Testrunner.
Aufgabe 3: Sortiert einfügen – erst das Struktogramm
In einer Liste stehen Namen alphabetisch sortiert. Die Methode void sortiertEinfuegen(List<String> pListe, String pName) soll pName so einfügen, dass die Liste sortiert bleibt.
a) Überlege, an welcher Stelle der neue Name hingehört. Welche Fälle musst du unterscheiden?
b) Entwirf im Editor ein Struktogramm für sortiertEinfuegen.
c) Setze es in der Klasse Listenwerkzeug um, bis die Tests zu sortiertEinfuegen grün sind.
Tipp: Namen vergleichen
a.compareTo(b) liefert eine Zahl kleiner 0, wenn a im Alphabet vor b steht, 0, wenn beide gleich sind, und eine Zahl größer 0, wenn a nach b steht.
Lauf also so lange weiter, wie das aktuelle Element vor dem neuen Namen steht. Dort, wo du stehen bleibst, gehört der neue Name davor. Bleibst du nirgends stehen, gehört er ans Ende.
Weiterdenken:
d) int position(List<String> pListe, String pGesucht) liefert die Stelle des ersten Vorkommens, gezählt ab 0, oder -1, wenn pGesucht nicht vorkommt.
e) boolean istSortiert(List<String> pListe) liefert, ob die Liste alphabetisch sortiert ist.