Ziel dieser Aufgabe ist es eine Klasse für eine Todo-Liste zu erstellen, deren Einträge in einem Array gespeichert werden. Einzelne Einträge können als "erledigt" (done) gekennzeichnet werden. Die gesamte Liste kann ausgegeben werden. In einem zweiten Schritt erstellen Sie einen Iterator mit dessen Hilfe die bisher unerledigten Einträge durchlaufen werden können.
A. Erstellen Sie zunächst eine Klasse TodoList indem Sie folgende Vorlage vervollständigen:
public class TodoList { private String[] list; private boolean[] done; private int size; public TodoList(String[] todos) { /* todo */ } // Mark entry with index i as "done" public void done(int i) { /* todo */ } // Print complete list public String toString() { /* todo */ } }
B. Fügen Sie TodoList eine innere Klasse UndoneIterator hinzu, die folgende Methoden bietet:
public String getNext(): Gibt nächsten unerledigten Eintrag der Liste zurück. Falls kein weiterer
Eintrag vorhanden ist, wird eine java.util.NoSuchElementException ausgelöst.public boolean hasNext(): true wenn es noch weitere unerledigte Einträge gibt.private int nextIndex(): Liefert den Index des nächsten unerledigten Eintrags
zurück, aber ohne den Index des Iterators zu erhöhen. Gibt -1 zurück, falls kein weiterer
unerledigter Eintrag vorhanden ist.C. Fügen Sie der Klasse TodoList eine Methode getIterator() hinzu, die einen neu erzeugten Iterator
für eine TodoList-Objekt zurück gibt.
Hinweis: Folgende Testklasse...
public class TodoListTest { public static void main(String[] args) { String[] entries = { "Clean dishes", "Exercise Java", "Workout", "Watch TV" }; TodoList todo = new TodoList(entries); todo.done(1); System.out.println("*Complete List*"); System.out.println(todo); System.out.println("*Open Items*"); TodoList.UndoneIterator i = todo.getIterator(); while (i.hasNext()) { System.out.println(i.getNext()); } } }
...ergibt folgende Ausgabe:
*Complete List* Clean dishes (Exercise Java) Workout Watch TV *Open Items* Clean dishes Workout Watch TV
Nachdem Sie im vergangenen Semester zahlreiche rechteckige Muster mit verschachtelten Schleifen ausgeben mussten, entschließen Sie sich, das Thema ein für allemal mit einer gesonderten Klasse zu behandeln!
Erstellen Sie dazu eine Klasse RechteckZeichner mit folgenden Methoden:
RechteckZeichner(char c, int b, int h): Konstruktor mit Angaben über benutztes Zeichen c (z.B. #), Breite b und Höhe habstract boolean istZeichenBei(int x, int y): Abstrakte Methode, welche angibt, ob sich an Position x, y ein Zeichen befindet.void zeichne(): Zeichnet das Rechteck.Erstellen Sie eine Klasse RechteckZeichnerTest, die mit Hilfe von vier Instanzen angepasster Kindklassen von RechteckZeichner die folgenden Muster erzeugt. Nutzen Sie dazu anonyme Klassen!
Zeichnen Sie auch andere Muster, z.B. ein Schachbrett, bei dem jedes Feld aus einem Quadrat aus 2x2 Zeichen besteht oder einen Kreis (●)!
########## ########## ########## ########## ########## ########## ########## ########## ########## ########## X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X OOOOOOOOOO O O O O O O O O O O O O O O O O OOOOOOOOOO % %% %%% %%%% %%%%% %%%%%% %%%%%%% %%%%%%%% %%%%%%%%% %%%%%%%%%%
Tipp: Das zweite Rechteck von oben können Sie z.B. auf folgende Weise zeichnen:
RechteckZeichner z = new RechteckZeichner('X', 20, 20) { public boolean istZeichenBei(int x, int y) { return (x+y)%4 == 0; } }; z.zeichne();
Schreiben Sie die Klasse SortMonate aus der Vorlesung (Kapitel 4, Anonyme Klassen) so um,
dass der Vergleicher möglichst kompakt als Lambda-Ausdruck formuliert wird!
Hinweis: Diese Aufgabe wird auf dem kommenden Aufgabenblatt ausgebaut und dann als Scheinaufgabe abgegeben!