Update of exercises

master
Thomas Smits 2024-01-20 16:52:10 +01:00
parent 6ccc245ab9
commit 92a445fc02
67 changed files with 242 additions and 1263 deletions

View File

@ -1,28 +1,16 @@
# Anonyme Klasse schreiben # Eigene compare-Methode schreiben
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Eine anonyme Klasse verwenden, um einen Event-Handler zu implementieren. Den Zugriff der anonymen Klasse auf Attribute der umgebenden Klasse und finale Parameter der Methode nutzen. Objekte vergleichen.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.lambda.anonymous](../sources/src/main/java/pr2/lambda/anonymous/). Gehen Sie in das Paket [pr2.lambda.array_sorter](../sources/src/main/java/pr2/lambda/array_sorter/).
Für diese Aufgabe müssen Sie das Gameframework einbinden. Sie finden es im `lib`-Ordner: [game_framework.jar](../sources/lib/game_framework.jar) Schreiben Sie ein Java-Programm `ReverseSort`, das ein Array mit `Date`-Objekten erzeugt und dieses dann mithilfe der `Arrays.sort`-Methode in umgekehrter Reihenfolge sortiert. Um die umgekehrte Sortierung zu erhalten, erzeugen Sie bitte direkt im Aufruf der `sort`-Methode einen entsprechenden `Comparator` als anonyme innere Klasse.
In dieser Aufgabe sollen Sie den Event-Handler für das Zerstören des Aliens als anonyme Klasse im Konstruktor von `GameBoard` realisieren. D.h. nicht mehr das Alien selbst reagiert auf das Klicken, sondern das `GameBoard` bekommt alle Klicks und überprüft, ob sich die Maus über dem Alien befindet.
Fügen Sie dem Konstruktor von `GameBoard` eine anonyme Klasse hinzu, die von `MouseAdapter` erbt. Überschreiben Sie in dieser Klasse die Methode `mousePressed` aus `MouseAdapter`.
In der `mousePressed`-Methode holen Sie die X- und Y-Koordinate aus dem `MouseEvent` und überprüfen Sie mit der Methode `intersects` von `Alien`, ob sich die Maus auch wirklich über dem Alien befindet. Wenn ja, rufen Sie die `explode`-Methode des Aliens auf.
Wenn sich der Mauszeiger nicht innerhalb des Aliens befindet, verschieben Sie das Alien (mit der Methode `setPosition`) an die Position des Mauszeigers.
Übergeben Sie die Instanz der anonymen Klasse der `addMouseListener`-Methode von `GameBoard`.
Lassen Sie das Programm laufen und überprüfen Sie, ob es das erwartete Verhalten zeigt.
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: Anonyme Klasse schreiben # Lösung: Eigene compare-Methode schreiben
Musterlösung: Musterlösung:
[pr2.lambda.anonymous](../../solutions/src/main/java/pr2/lambda/anonymous/) [pr2.lambda.array_sorter](../../solutions/src/main/java/pr2/lambda/array_sorter/)

View File

@ -1,16 +1,20 @@
# Eigene compare-Methode schreiben # Innere Klasse Beobachter
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Objekte vergleichen. Zugriff von inneren Klassen auf die umgebende Klasse.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.lambda.array_sorter](../sources/src/main/java/pr2/lambda/array_sorter/). Gehen Sie in das Paket: [pr2.lambda.observer](../sources/src/main/java/pr2/lambda/observer/).
Schreiben Sie ein Java-Programm `ReverseSort`, das ein Array mit `Date`-Objekten erzeugt und dieses dann mithilfe der `Arrays.sort`-Methode in umgekehrter Reihenfolge sortiert. Um die umgekehrte Sortierung zu erhalten, erzeugen Sie bitte direkt im Aufruf der `sort`-Methode einen entsprechenden `Comparator` als anonyme innere Klasse. Dort finden Sie das Interface `Beobachter`.
Schreiben Sie eine Klasse `Datenhalter`, die eine einziges, privates Attribut vom Typ `int` enthält. Setzen Sie das Attribut im Konstruktor, erzeugen Sie aber keinen Getter.
Implementieren Sie das Interface `Beobachter` als nicht-statische, private innere Klasse in `Datenhalter` und erlauben Sie über den Beobachter Zugriff auf das Attribut, indem Sie ein entsprechendes Objekt vom Typ `Beobachter` zurückgeben. Testen Sie Ihre Implementierung mit einem JUnit-Test.
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: Eigene compare-Methode schreiben # Lösung: Innere Klasse Beobachter
Musterlösung: Musterlösung:
[pr2.lambda.array_sorter](../../solutions/src/main/java/pr2/lambda/array_sorter/) [pr2.lambda.observer](../../solutions/src/main/java/pr2/lambda/observer/).

View File

@ -1,20 +1,20 @@
# Innere Klasse Beobachter # Callback mit anonymer Klasse realisieren
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Zugriff von inneren Klassen auf die umgebende Klasse. Eine gegebene Funktion durch einen Callback parametrieren. Der Callback wird als anonyme innere Klasse realisiert.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket: [pr2.lambda.observer](../sources/src/main/java/pr2/lambda/observer/). Gehen Sie in das Paket [pr2.lambda.callback](../sources/src/main/java/pr2/lambda/callback/).
Dort finden Sie das Interface `Beobachter`. In dieser Aufgabe wird ein sehr gängiges Muster benutzt, dass auch bei großen Suchmaschinen zum Einsatz kommt. Über eine Filter-Funktion werden aus einer Menge von Daten diejenigen ausgewählt, die gewünscht sind. Die Auswahlfunktion wird von außen vorgegeben, sodass beliebige Filteroperationen möglich sind, auch solche, die beim Schreiben des Rahmenwerkes noch nicht bekannt waren.
Schreiben Sie eine Klasse `Datenhalter`, die eine einziges, privates Attribut vom Typ `int` enthält. Setzen Sie das Attribut im Konstruktor, erzeugen Sie aber keinen Getter. Sehen Sie sich das Interface `Prediacte` und die Klasse `NumberSelector` an und versuchen Sie die Funktionsweise der beiden zu verstehen. Betrachten Sie nun die Klasse `Main`, die versucht zuerst die geraden und dann die ungeraden Zahlen auszuwählen und auszugeben. Der hierfür nötige Code ist zwar schon weitgehend vorhanden, aber in der `main`-Methode müssen Sie noch zwei passende Filterfunktionen als **anonyme innere Klassen** realisieren.
Implementieren Sie das Interface `Beobachter` als nicht-statische, private innere Klasse in `Datenhalter` und erlauben Sie über den Beobachter Zugriff auf das Attribut, indem Sie ein entsprechendes Objekt vom Typ `Beobachter` zurückgeben. Testen Sie Ihre Implementierung mit einem JUnit-Test. Nachdem Sie die beiden Filter geschrieben haben, lassen Sie das Programm laufen und überprüfen Sie, ob wirklich die richtigen Zahlen ausgewählt werden.
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: Innere Klasse Beobachter # Lösung: Callback mit anonymer Klasse realisieren
Musterlösung: Musterlösung:
[pr2.lambda.observer](../../solutions/src/main/java/pr2/lambda/observer/). [pr2.lambda.callback](../../solutions/src/main/java/pr2/lambda/callback/)

View File

@ -1,20 +1,19 @@
# Callback mit anonymer Klasse realisieren # Comparator als Lambda
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Eine gegebene Funktion durch einen Callback parametrieren. Der Callback wird als anonyme innere Klasse realisiert. Lambdas verwenden.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.lambda.callback](../sources/src/main/java/pr2/lambda/callback/). Gehen Sie in das Paket
[pr2.lambda.comparator](../sources/src/main/java/pr2/lambda/comparator/).
In dieser Aufgabe wird ein sehr gängiges Muster benutzt, dass auch bei großen Suchmaschinen zum Einsatz kommt. Über eine Filter-Funktion werden aus einer Menge von Daten diejenigen ausgewählt, die gewünscht sind. Die Auswahlfunktion wird von außen vorgegeben, sodass beliebige Filteroperationen möglich sind, auch solche, die beim Schreiben des Rahmenwerkes noch nicht bekannt waren. Als Teil der Java-Klassenbibliothek findet sich das Interface `Comparator`, mit dem beim Sortieren eine Sortierreihenfolge vorgeben werden kann. Da es sich um ein funktionales Interface handelt, kann man es auch mit einem Lambda-Ausdruck implementieren. Schauen Sie sich den Aufbau des Interfaces in der JavaDoc an.
Sehen Sie sich das Interface `Prediacte` und die Klasse `NumberSelector` an und versuchen Sie die Funktionsweise der beiden zu verstehen. Betrachten Sie nun die Klasse `Main`, die versucht zuerst die geraden und dann die ungeraden Zahlen auszuwählen und auszugeben. Der hierfür nötige Code ist zwar schon weitgehend vorhanden, aber in der `main`-Methode müssen Sie noch zwei passende Filterfunktionen als **anonyme innere Klassen** realisieren. Sortieren Sie ein Array von Zahlen (repräsentiert als `Integer`, nicht als `int`) in _absteigender_ Reihenfolge mithilfe der Methode `sort` der Klasse `Arrays` und geben Sie ihr einen entsprechenden `Comparator` als Lambda-Ausdruck mit.
Nachdem Sie die beiden Filter geschrieben haben, lassen Sie das Programm laufen und überprüfen Sie, ob wirklich die richtigen Zahlen ausgewählt werden.
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: Callback mit anonymer Klasse realisieren # Lösung: Comparator als Lambda
Musterlösung: Musterlösung:
[pr2.lambda.callback](../../solutions/src/main/java/pr2/lambda/callback/) [pr2.lambda.comparator](../../solutions/src/main/java/pr2/lambda/comparator/)

View File

@ -1,19 +1,22 @@
# Comparator als Lambda # Callback mit Lambda realisieren
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Lambdas verwenden. Eine gegebene Funktion durch einen Callback parametrieren. Der Callback wird als Lambda realisiert.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket Gehen Sie in das Paket [pr2.lambda.lambdas](../sources/src/main/java/pr2/lambda/lambdas/).
[pr2.lambda.comparator](../sources/src/main/java/pr2/lambda/comparator/).
Als Teil der Java-Klassenbibliothek findet sich das Interface `Comparator`, mit dem beim Sortieren eine Sortierreihenfolge vorgeben werden kann. Da es sich um ein funktionales Interface handelt, kann man es auch mit einem Lambda-Ausdruck implementieren. Schauen Sie sich den Aufbau des Interfaces in der JavaDoc an. In dieser Aufgabe wird ein sehr gängiges Muster benutzt, dass auch bei großen Suchmaschinen zum Einsatz kommt. Über eine Filter-Funktion werden aus einer Menge von Daten diejenigen ausgewählt, die gewünscht sind. Die Auswahlfunktion wird von außen vorgegeben, sodass beliebige Filteroperationen möglich sind, auch solche, die beim Schreiben des Rahmenwerkes noch nicht bekannt waren.
Sortieren Sie ein Array von Zahlen (repräsentiert als `Integer`, nicht als `int`) in _absteigender_ Reihenfolge mithilfe der Methode `sort` der Klasse `Arrays` und geben Sie ihr einen entsprechenden `Comparator` als Lambda-Ausdruck mit. Sehen Sie sich das Interface `Predicate` und die Klasse `NumberSelector` an und versuchen Sie die Funktionsweise der beiden zu verstehen. Betrachten Sie nun die Klasse `Main`, die versucht zuerst die geraden und dann die ungeraden Zahlen auszuwählen und auszugeben. Der hierfür nötige Code ist zwar schon weitgehend vorhanden, aber in der `main`-Methode müssen Sie noch zwei passende Filterfunktionen als **Lambda** realisieren.
Nachdem Sie die beiden Filter geschrieben haben, lassen Sie das Programm laufen und überprüfen Sie, ob wirklich die richtigen Zahlen ausgewählt werden.
Vergleichen Sie die Lösung mit Lambdas mit der aus der vorhergehenden Aufgabe, die auf anonymen inneren Klassen basiert hat.
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: Comparator als Lambda # Lösung: Callback mit Lambda realisieren
Musterlösung: Musterlösung:
[pr2.lambda.comparator](../../solutions/src/main/java/pr2/lambda/comparator/) [pr2.lambda.lambdas](../../solutions/src/main/java/pr2/lambda/lambdas/)

View File

@ -1,22 +1,18 @@
# Callback mit Lambda realisieren # MatrixSuche
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Eine gegebene Funktion durch einen Callback parametrieren. Der Callback wird als Lambda realisiert. Statische innere Klassen einsetzen.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.lambda.lambdas](../sources/src/main/java/pr2/lambda/lambdas/). Gehen Sie in das Paket [pr2.lambda.matrixsuche](../sources/src/main/java/pr2/lambda/matrixsuche/).
In dieser Aufgabe wird ein sehr gängiges Muster benutzt, dass auch bei großen Suchmaschinen zum Einsatz kommt. Über eine Filter-Funktion werden aus einer Menge von Daten diejenigen ausgewählt, die gewünscht sind. Die Auswahlfunktion wird von außen vorgegeben, sodass beliebige Filteroperationen möglich sind, auch solche, die beim Schreiben des Rahmenwerkes noch nicht bekannt waren. Schreiben Sie eine Klasse `MatrixSuche`, die eine statische Methode `findEntry` anbietet. Die Methode soll in einem zweidimensionalen `int`-Array nach einem gegebenen Eintrag suchen und die Position des gefundenen Eintrags in der Matrix zurückgeben. Um die Position zurückzugeben, verwenden Sie bitte eine statische innere Klasse namens `Position`, die die x- und y-Postion enthält.
Sehen Sie sich das Interface `Predicate` und die Klasse `NumberSelector` an und versuchen Sie die Funktionsweise der beiden zu verstehen. Betrachten Sie nun die Klasse `Main`, die versucht zuerst die geraden und dann die ungeraden Zahlen auszuwählen und auszugeben. Der hierfür nötige Code ist zwar schon weitgehend vorhanden, aber in der `main`-Methode müssen Sie noch zwei passende Filterfunktionen als **Lambda** realisieren. Überschreiben Sie die `toString`-Methode in `Position` und testen Sie, ob Ihre Implementierung richtig funktioniert.
Nachdem Sie die beiden Filter geschrieben haben, lassen Sie das Programm laufen und überprüfen Sie, ob wirklich die richtigen Zahlen ausgewählt werden.
Vergleichen Sie die Lösung mit Lambdas mit der aus der vorhergehenden Aufgabe, die auf anonymen inneren Klassen basiert hat.
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: Callback mit Lambda realisieren # Lösung: MatrixSuche
Musterlösung: Musterlösung:
[pr2.lambda.lambdas](../../solutions/src/main/java/pr2/lambda/lambdas/) [pr2.lambda.matrixsuche](../../solutions/src/main/java/pr2/lambda/matrixsuche/)

View File

@ -1,26 +1,24 @@
# Lokale Klasse schreiben # StringTransmogrifier
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Eine lokale Klasse verwenden, um einen Event-Handler zu implementieren. Den Zugriff der lokalen Klasse auf Attribute der umgebenden Klasse und finale Parameter der Methode nutzen. Funktionale Interfaces entwerfen und verwenden.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.lambda.local](../sources/src/main/java/pr2/lambda/local/). Gehen Sie in das Paket [pr2.lambda.mogrifier_1](../sources/src/main/java/pr2/lambda/mogrifier_1/).
Für diese Aufgabe müssen Sie das Gameframework einbinden. Sie finden es im `lib`-Ordner: [game_framework.jar](../sources/lib/game_framework.jar) Schreiben Sie ein funktionales Interface namens `StringFunction`. Die Methode des Interfaces nimmt eine String und gibt einen String zurück.
In dieser Aufgabe sollen Sie den Event-Handler für das Zerstören des Aliens als lokale Klasse im Konstruktor von `GameBoard` realisieren. D.h. nicht mehr das Alien selbst reagiert auf das Klicken, sondern das `GameBoard` bekommt alle Klicks und überprüft, ob sich die Maus über dem Alien befindet. Schreiben Sie eine Klasse `StringTransmogrifier`, die eine statische Methode `transmogrify` hat, der man ein String-Array und eine `StringFunction` übergibt. Die Methode wendet die Funktion auf jedes Element des Arrays an und gibt ein neues Array mit dem Ergebnis zurück.
Fügen Sie dem Konstruktor von `GameBoard` eine lokale Klasse `AlienExploder` hinzu, die von `MouseAdapter` erbt. Überschreiben Sie in dieser Klasse die Methode `mousePressed` aus `MouseAdapter`. Schreiben Sie eine Klasse `StringTransmogrifierTest`, die ein String-Array erzeugt und dann mithilfe der Klasse `StringTransmogrifier` die Elemente verändert. Nehmen Sie folgende Änderungen am Array vor, indem Sie entsprechende Lambda-Ausdrücke oder Methodenreferenzen übergeben:
In der `mousePressed`-Methode holen Sie die X- und Y-Koordinate aus dem `MouseEvent` und überprüfen Sie mit der Methode `intersects` von `Alien`, ob sich die Maus auch wirklich über dem Alien befindet. Wenn ja, rufen Sie die `explode`-Methode des Aliens auf. * Umwandeln aller Buchstaben in Kleinbuchstaben.
* Umwandeln aller Buchstaben in Großbuchstaben.
Erzeugen Sie nach der Deklaration der Klasse `AlienExploder` eine Instanz von dieser und übergeben Sie das Objekt der `addMouseListener`-Methode von `GameBoard`. * Ersetzen jedes Buchstaben durch den im Alphabet folgenden.
Lassen Sie das Programm laufen und überprüfen Sie, ob es das erwartete Verhalten zeigt.
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: Lokale Klasse schreiben # Lösung: StringTransmogrifier
Musterlösung: Musterlösung:
[pr2.lambda.local](../../solutions/src/main/java/pr2/lambda/local/) [pr2.lambda.mogrifier_1](../../solutions/src/main/java/pr2/lambda/mogrifier_1/)

View File

@ -1,18 +1,18 @@
# MatrixSuche # StringTransmogrifier erweitern
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Statische innere Klassen einsetzen. Funktionale Interfaces entwerfen und verwenden.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.lambda.matrixsuche](../sources/src/main/java/pr2/lambda/matrixsuche/). Gehen Sie in das Paket [pr2.lambda.mogrifier_2](../sources/src/main/java/pr2/lambda/mogrifier_2/).
Schreiben Sie eine Klasse `MatrixSuche`, die eine statische Methode `findEntry` anbietet. Die Methode soll in einem zweidimensionalen `int`-Array nach einem gegebenen Eintrag suchen und die Position des gefundenen Eintrags in der Matrix zurückgeben. Um die Position zurückzugeben, verwenden Sie bitte eine statische innere Klasse namens `Position`, die die x- und y-Postion enthält. Ausgehend von der vorhergehenden Aufgabe, erweitern Sie das Interface `StringFunction` um eine _statische Methode_ namens `caesar`, mit der man sich eine `StringFunction` erzeugen lassen kann, die die Buchstaben des Strings um einen frei wählbaren Wert verschiebt.
Überschreiben Sie die `toString`-Methode in `Position` und testen Sie, ob Ihre Implementierung richtig funktioniert. Teste Sie Ihre Implementierung wieder mit `StringTransmogrifierTest`.
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: MatrixSuche # Lösung: StringTransmogrifier erweitern
Musterlösung: Musterlösung:
[pr2.lambda.matrixsuche](../../solutions/src/main/java/pr2/lambda/matrixsuche/) [pr2.lambda.mogrifier_2](../../solutions/src/main/java/pr2/lambda/mogrifier_2/)

View File

@ -1,24 +1,20 @@
# StringTransmogrifier # Static Member Class
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Funktionale Interfaces entwerfen und verwenden. Eine Klasse als statische Elementklasse realisieren.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.lambda.mogrifier_1](../sources/src/main/java/pr2/lambda/mogrifier_1/). Gehen Sie in das Paket [pr2.lambda.static_member](../sources/src/main/java/pr2/lambda/static_member/).
Schreiben Sie ein funktionales Interface namens `StringFunction`. Die Methode des Interfaces nimmt eine String und gibt einen String zurück. In dieser Aufgabe finden Sie bereits ein voll funktionsfähiges Beispiel vor. Lassen Sie es laufen und machen Sie sich mit der Funktionsweise vertraut. (Das Spiel kennen Sie bereits aus einer vorhergehenden Aufgabe, nur die Grafik ist etwas anders.)
Schreiben Sie eine Klasse `StringTransmogrifier`, die eine statische Methode `transmogrify` hat, der man ein String-Array und eine `StringFunction` übergibt. Die Methode wendet die Funktion auf jedes Element des Arrays an und gibt ein neues Array mit dem Ergebnis zurück. Ihre Aufgabe besteht nun darin, die Klasse `Alien` zu einer statischen Elementklasse der Klasse `GameBoard` zu machen.
Schreiben Sie eine Klasse `StringTransmogrifierTest`, die ein String-Array erzeugt und dann mithilfe der Klasse `StringTransmogrifier` die Elemente verändert. Nehmen Sie folgende Änderungen am Array vor, indem Sie entsprechende Lambda-Ausdrücke oder Methodenreferenzen übergeben: Lassen Sie das Programm nach der Änderung wieder laufen und schauen überprüfen Sie, dass es sich noch korrekt verhält.
* Umwandeln aller Buchstaben in Kleinbuchstaben.
* Umwandeln aller Buchstaben in Großbuchstaben.
* Ersetzen jedes Buchstaben durch den im Alphabet folgenden.
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: StringTransmogrifier # Lösung: Static Member Class
Musterlösung: Musterlösung:
[pr2.lambda.mogrifier_1](../../solutions/src/main/java/pr2/lambda/mogrifier_1/) [pr2.lambda.static_member](../../solutions/src/main/java/pr2/lambda/static_member/)

View File

@ -1,18 +1,20 @@
# StringTransmogrifier erweitern # Iterator schreiben
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Funktionale Interfaces entwerfen und verwenden. Für eine gegebene Klasse einen Iterator schreiben.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.lambda.mogrifier_2](../sources/src/main/java/pr2/lambda/mogrifier_2/). Gehen Sie in das Paket [pr2.collections.iterator](../sources/src/main/java/pr2/collections/iterator/).
Ausgehend von der vorhergehenden Aufgabe, erweitern Sie das Interface `StringFunction` um eine _statische Methode_ namens `caesar`, mit der man sich eine `StringFunction` erzeugen lassen kann, die die Buchstaben des Strings um einen frei wählbaren Wert verschiebt. In dieser Aufgabe sollen Sie für eine bereits vorhandene Klasse einen Iterator schreiben. Bei dieser Klasse (`SimpleStack`) handelt es sich um einen sehr einfach (und nicht sehr sicher) programmierten Stack.
Teste Sie Ihre Implementierung wieder mit `StringTransmogrifierTest`. Implementieren Sie in `SimpleStack<T>` das Interface `Iterable<T>` und schreiben Sie, wie vom Interface verlangt einen Iterator für die Klasse. Sie sollten hier innere Klasse verwenden, um den Zugriff auf die privaten Attribute von `SimpleStack` zu vereinfachen.
Benutzen Sie die Tests in `SimpleStackTest`, um zu überprüfen, dass Ihre Implementierung des Iterators richtig funktioniert. Hierzu müssen Sie die entsprechenden Tests allerdings erst einkommentieren.
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: StringTransmogrifier erweitern # Lösung: Iterator schreiben
Musterlösung: Musterlösung:
[pr2.lambda.mogrifier_2](../../solutions/src/main/java/pr2/lambda/mogrifier_2/) [pr2.collections.iterator](../../solutions/src/main/java/pr2/collections/iterator/)

View File

@ -1,20 +1,22 @@
# Nonstatic Member Class # Mithilfe eines Iterators über Daten iterieren
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Eine nichtstatische Elementklasse verwenden. Den Iterator einer vorhandenen Klasse verwenden, um Daten auszulesen.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.lambda.nonstatic](../sources/src/main/java/pr2/lambda/nonstatic/). Gehen Sie in das Paket [pr2.collections.iterieren](../sources/src/main/java/pr2/collections/iterieren/).
Für diese Aufgabe müssen Sie das Gameframework einbinden. Sie finden es im `lib`-Ordner: [game_framework.jar](../sources/lib/game_framework.jar) Bei dieser Aufgabe werden Sie mit einem `Iterator` über eine Menge von Objekten iterieren. Die Besonderheit besteht darin, dass der Iterator keine feste Menge von Objekten liefert, sondern diese zufällig generiert. Dies ist zwar ungewöhnlich, soll aber zeigen, dass beim Iterieren nicht zwangsläufig bei jedem Durchlauf dieselben Daten kommen.
Wieder geht es um das einfache Spiel. Diesmal sollen Sie allerdings die Klasse `Alien` zu einer nichtstatischen Elementklasse von `GameBoard` machen. Achten Sie insbesondere darauf, dass sie nur noch die implizite Referenz `GameBoard.this` verwenden, um das Board innerhalb von `Alien` zu verwenden. Außerdem soll sich `Alien` im Konstruktor selbst als `MouseListener` registrieren, d.h. die entsprechende Zeile `addMouseListener(alien);` soll aus `GameBoard` verschwinden und in `Alien` verwendet werden. Betrachten Sie die Klasse `CoinGenerator` und versuchen Sie deren Funktionsweise zu verstehen. Schauen Sie sich insbesondere an, wie der Iterator in dieser Klasse implementiert ist.
Lassen Sie das Spiel wieder laufen und überprüfen Sie, ob es korrekt funktioniert. Modifizieren Sie nun die Klasse `GameBoard` so, dass sie den `CoinGenerator` verwendet, um Münzen zu erzeugen und diese dann auf dem Bildschirm anzuzeigen. Überlegen Sie sich, ob Sie die erzeugten Münzen zwischenspeichern müssen oder ob Sie den Iterator direkt in der `drawGame`-Methode verwenden können.
Implementieren Sie Ihre Lösung und lassen Sie diese laufen, um sie zu testen.
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: Nonstatic Member Class # Lösung: Mithilfe eines Iterators über Daten iterieren
Musterlösung: Musterlösung:
[pr2.lambda.nonstatic](../../solutions/src/main/java/pr2/lambda/nonstatic/) [pr2.collections.iterieren](../../solutions/src/main/java/pr2/collections/iterieren/)

View File

@ -1,20 +1,16 @@
# Static Member Class # Iterator programmieren
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Eine Klasse als statische Elementklasse realisieren. Iteratoren verstehen und programmieren.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.lambda.static_member](../sources/src/main/java/pr2/lambda/static_member/). Im Paket [pr2.collections.list_iterator](../sources/src/main/java/pr2/collections/list_iterator/) finden Sie den Code für eine einfach verkettete Liste `Liste<T>`.
In dieser Aufgabe finden Sie bereits ein voll funktionsfähiges Beispiel vor. Lassen Sie es laufen und machen Sie sich mit der Funktionsweise vertraut. (Das Spiel kennen Sie bereits aus einer vorhergehenden Aufgabe, nur die Grafik ist etwas anders.) Geben Sie bitte den fehlenden Code für die innere Klasse `ListenIterator` an.
Ihre Aufgabe besteht nun darin, die Klasse `Alien` zu einer statischen Elementklasse der Klasse `GameBoard` zu machen.
Lassen Sie das Programm nach der Änderung wieder laufen und schauen überprüfen Sie, dass es sich noch korrekt verhält.
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: Static Member Class # Lösung: Iterator programmieren
Musterlösung: Musterlösung:
[pr2.lambda.static_member](../../solutions/src/main/java/pr2/lambda/static_member/) [pr2.collections.list_iterator](../../solutions/src/main/java/pr2/collections/list_iterator/)

View File

@ -1,20 +1,24 @@
# Iterator schreiben # `List<T>` und dessen Implementierungen
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Für eine gegebene Klasse einen Iterator schreiben. Das Interface `List<T>` und eine passende Implementierung einsetzen.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.collections.iterator](../sources/src/main/java/pr2/collections/iterator/). Gehen Sie in das Paket [pr2.collections.list](../sources/src/main/java/pr2/collections/list/).
In dieser Aufgabe sollen Sie für eine bereits vorhandene Klasse einen Iterator schreiben. Bei dieser Klasse (`SimpleStack`) handelt es sich um einen sehr einfach (und nicht sehr sicher) programmierten Stack. Im Projekt finden Sie die Klasse `WordCollector` mit deren Hilfe man die Wörter in einem Text analysieren kann. Nach Übergabe eines Dateinamens wird die Datei eingelesen und die vorhandenen Wörter werden gesammelt. Am Ende wird die Liste der Wörter alphabetisch sortiert ausgegeben.
Implementieren Sie in `SimpleStack<T>` das Interface `Iterable<T>` und schreiben Sie, wie vom Interface verlangt einen Iterator für die Klasse. Sie sollten hier innere Klasse verwenden, um den Zugriff auf die privaten Attribute von `SimpleStack` zu vereinfachen. Leider wurde `WordCollector` von einem Entwickler geschrieben, der nichts von dem Collection-Framework wusste und daher alles mit Array realisiert hat. Hierdurch sind einige sehr komplexe Konstruktionen entstanden.
Benutzen Sie die Tests in `SimpleStackTest`, um zu überprüfen, dass Ihre Implementierung des Iterators richtig funktioniert. Hierzu müssen Sie die entsprechenden Tests allerdings erst einkommentieren. Lassen Sie das Programm laufen und betrachten Sie die Ausgabe. Schauen Sie sich die Klasse `WordCollector` an und versuchen Sie die Funktionsweise und die Implementierung genau zu verstehen. Dieser Schritt ist wichtig, um die im Folgenden beschriebenen Änderungen an der Klasse vornehmen zu können, lassen Sie sich also Zeit für diesen Schritt.
Ändern Sie die Klasse nun so, dass anstatt Arrays `List<T>` und deren Implementierungen verwendet werden. Ändern Sie die Schnittstellen und Parameter der Methoden von `String[]` auf `List<String>`. Modifizieren Sie auch die Implementierung der Methoden und versuchen Sie Arrays wo immer möglich durch Listen zu ersetzen. Schauen Sie sich auch die JavaDoc der Klassen `java.util.Arrays` und `java.util.Collections` an, um möglicherweise sehr hilfreiche Methoden zu finden.
__Hinweis:__ Die Konstruktion `String[] words = line.toLowerCase().split("[,. ]");` können Sie nicht durch Listen ersetzen, da die `split`-Methode Arrays verwendet.
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: Iterator schreiben # Lösung: `List<T>` und dessen Implementierungen
Musterlösung: Musterlösung:
[pr2.collections.iterator](../../solutions/src/main/java/pr2/collections/iterator/) [pr2.collections.list](../../solutions/src/main/java/pr2/collections/list/)

View File

@ -1,22 +1,38 @@
# Mithilfe eines Iterators über Daten iterieren # `Map<T>` verwenden
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Den Iterator einer vorhandenen Klasse verwenden, um Daten auszulesen. Das Interface `Map<T>` und seine Implementierungen verwenden, um Daten effizient zu verarbeiten.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.collections.iterieren](../sources/src/main/java/pr2/collections/iterieren/). Gehen Sie in das Paket [pr2.collections.map](../sources/src/main/java/pr2/collections/map/).
Bei dieser Aufgabe werden Sie mit einem `Iterator` über eine Menge von Objekten iterieren. Die Besonderheit besteht darin, dass der Iterator keine feste Menge von Objekten liefert, sondern diese zufällig generiert. Dies ist zwar ungewöhnlich, soll aber zeigen, dass beim Iterieren nicht zwangsläufig bei jedem Durchlauf dieselben Daten kommen. In dieser Aufgabe geht es darum, die Häufigkeit von Wörtern in einem Text zu analysieren. Ein grundlegendes Gerüst für das Programm ist auch bereits vorgegeben, damit Sie sich auf das Wesentliche konzentrieren können.
Betrachten Sie die Klasse `CoinGenerator` und versuchen Sie deren Funktionsweise zu verstehen. Schauen Sie sich insbesondere an, wie der Iterator in dieser Klasse implementiert ist. Betrachten Sie die Klasse `WordCount`. In dieser fehlen noch einige Elemente, damit das Programm korrekt funktionieren kann.
Modifizieren Sie nun die Klasse `GameBoard` so, dass sie den `CoinGenerator` verwendet, um Münzen zu erzeugen und diese dann auf dem Bildschirm anzuzeigen. Überlegen Sie sich, ob Sie die erzeugten Münzen zwischenspeichern müssen oder ob Sie den Iterator direkt in der `drawGame`-Methode verwenden können. Die innere Klasse `WordFrequency` muss das Sortieren unterstützen. Implementieren Sie daher das Interface `Comparable`.
Implementieren Sie Ihre Lösung und lassen Sie diese laufen, um sie zu testen. Fügen Sie in der Klasse `WordCount` an den durch TODO-Kommentare markierten Stellen Code hinzu, der mithilfe einer Map die Worthäufigkeiten bestimmt.
Lassen Sie das Programm laufen. Es sollte eine Ausgabe wie folgt erzeugen:
```console
er: 80
sie: 66
und: 64
die: 59
der: 51
zu: 46
es: 45
nicht: 41
das: 38
in: 35
...
```
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: Mithilfe eines Iterators über Daten iterieren # Lösung: `Map<T>` verwenden
Musterlösung: Musterlösung:
[pr2.collections.iterieren](../../solutions/src/main/java/pr2/collections/iterieren/) [pr2.collections.map](../../solutions/src/main/java/pr2/collections/map/)

View File

@ -1,16 +1,18 @@
# Iterator programmieren # ReverserGeneric
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Iteratoren verstehen und programmieren. `Comparable` verstehen und nutzen.
## Aufgabe ## Aufgabe
Im Paket [pr2.collections.list_iterator](../sources/src/main/java/pr2/collections/list_iterator/) finden Sie den Code für eine einfach verkettete Liste `Liste<T>`. Gehen Sie in das Paket [pr2.collections.reverser_generic](../sources/src/main/java/pr2/collections/reverser_generic/).
Geben Sie bitte den fehlenden Code für die innere Klasse `ListenIterator` an. Schreiben Sie bitte eine generische Klasse `Reverser` mit einer Methode `reverse`, der man eine Liste (`java.util.List`) von Objekten übergeben kann und diese absteigend sortiert wird. Stellen Sie durch korrekte Wahl des Typ-Parameters sicher, dass die in der Liste gespeicherten Objekte das Interface `Comparable` implementieren.
Testen Sie Ihre Implementierung mit der Klasse `ReverserTest`.
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: Iterator programmieren # Lösung: ReverserGeneric
Musterlösung: Musterlösung:
[pr2.collections.list_iterator](../../solutions/src/main/java/pr2/collections/list_iterator/) [pr2.collections.reverser_generic](../../solutions/src/main/java/pr2/collections/reverser_generic/)

View File

@ -1,24 +1,18 @@
# `List<T>` und dessen Implementierungen # Strings umgekehrt sortieren: Reverser
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Das Interface `List<T>` und eine passende Implementierung einsetzen. `Comparable` verstehen und nutzen.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.collections.list](../sources/src/main/java/pr2/collections/list/). Gehen Sie in das Paket [pr2.collections.reverser](../sources/src/main/java/pr2/collections/reverser/).
Im Projekt finden Sie die Klasse `WordCollector` mit deren Hilfe man die Wörter in einem Text analysieren kann. Nach Übergabe eines Dateinamens wird die Datei eingelesen und die vorhandenen Wörter werden gesammelt. Am Ende wird die Liste der Wörter alphabetisch sortiert ausgegeben. Schreiben Sie bitte eine Klasse `Reverser` mit einer Methode `reverse`, der man eine Liste (`java.util.List`) von `String` übergeben kann und die diese dann absteigend sortiert, d.h. als Erstes kommen die Einträge mit Z, dann die mit Y etc.
Leider wurde `WordCollector` von einem Entwickler geschrieben, der nichts von dem Collection-Framework wusste und daher alles mit Array realisiert hat. Hierdurch sind einige sehr komplexe Konstruktionen entstanden. Testen Sie Ihre Implementierung mit der Klasse `ReverserTest`.
Lassen Sie das Programm laufen und betrachten Sie die Ausgabe. Schauen Sie sich die Klasse `WordCollector` an und versuchen Sie die Funktionsweise und die Implementierung genau zu verstehen. Dieser Schritt ist wichtig, um die im Folgenden beschriebenen Änderungen an der Klasse vornehmen zu können, lassen Sie sich also Zeit für diesen Schritt.
Ändern Sie die Klasse nun so, dass anstatt Arrays `List<T>` und deren Implementierungen verwendet werden. Ändern Sie die Schnittstellen und Parameter der Methoden von `String[]` auf `List<String>`. Modifizieren Sie auch die Implementierung der Methoden und versuchen Sie Arrays wo immer möglich durch Listen zu ersetzen. Schauen Sie sich auch die JavaDoc der Klassen `java.util.Arrays` und `java.util.Collections` an, um möglicherweise sehr hilfreiche Methoden zu finden.
__Hinweis:__ Die Konstruktion `String[] words = line.toLowerCase().split("[,. ]");` können Sie nicht durch Listen ersetzen, da die `split`-Methode Arrays verwendet.
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: `List<T>` und dessen Implementierungen # Lösung: Strings umgekehrt sortieren: Reverser
Musterlösung: Musterlösung:
[pr2.collections.list](../../solutions/src/main/java/pr2/collections/list/) [pr2.collections.reverser](../../solutions/src/main/java/pr2/collections/reverser/)

View File

@ -1,38 +1,24 @@
# `Map<T>` verwenden # `Set<T>` und dessen Implementierungen
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Das Interface `Map<T>` und seine Implementierungen verwenden, um Daten effizient zu verarbeiten. Das Interface `Set<T>` und eine passende Implementierung einsetzen.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.collections.map](../sources/src/main/java/pr2/collections/map/). Gehen Sie in das Paket [pr2.collections.set](../sources/src/main/java/pr2/collections/set/).
In dieser Aufgabe geht es darum, die Häufigkeit von Wörtern in einem Text zu analysieren. Ein grundlegendes Gerüst für das Programm ist auch bereits vorgegeben, damit Sie sich auf das Wesentliche konzentrieren können. Im Projekt finden Sie die Klasse `WordCollector` mit deren Hilfe man die Wörter in einem Text analysieren kann. Nach Übergabe eines Dateinamens wird die Datei eingelesen und die vorhandenen Wörter werden gesammelt. Am Ende wird die Liste der Wörter alphabetisch sortiert ausgegeben.
Betrachten Sie die Klasse `WordCount`. In dieser fehlen noch einige Elemente, damit das Programm korrekt funktionieren kann. Leider wurde `WordCollector` von einem Entwickler geschrieben, der nichts von dem Collection-Framework wusste und daher alles mit Array realisiert hat. Hierdurch sind einige sehr komplexe Konstruktionen entstanden.
Die innere Klasse `WordFrequency` muss das Sortieren unterstützen. Implementieren Sie daher das Interface `Comparable`. Lassen Sie das Programm laufen und betrachten Sie die Ausgabe. Schauen Sie sich die Klasse `WordCollector` an und versuchen Sie die Funktionsweise und die Implementierung genau zu verstehen. Dieser Schritt ist wichtig, um die im Folgenden beschriebenen Änderungen an der Klasse vornehmen zu können, lassen Sie sich also Zeit für diesen Schritt.
Fügen Sie in der Klasse `WordCount` an den durch TODO-Kommentare markierten Stellen Code hinzu, der mithilfe einer Map die Worthäufigkeiten bestimmt. Ändern Sie die Klasse nun so, dass anstatt Arrays `Set<T>` und deren Implementierungen verwendet werden. Ändern Sie die Schnittstellen und Parameter der Methoden von `String[]` auf `Set<String>` bzw. `List<String>`. Modifizieren Sie auch die Implementierung der Methoden und versuchen Sie Arrays wo immer möglich durch Sets und Listen zu ersetzen. Schauen Sie sich auch die JavaDoc der Klassen `java.util.Arrays` und `java.util.Collections` an, um möglicherweise sehr hilfreiche Methoden zu finden.
Lassen Sie das Programm laufen. Es sollte eine Ausgabe wie folgt erzeugen: __Hinweis:__ Die Konstruktion `String[] words = line.toLowerCase().split("[,. ]");` können Sie nicht durch Listen ersetzen, da die `split`-Methode Arrays verwendet.
```console
er: 80
sie: 66
und: 64
die: 59
der: 51
zu: 46
es: 45
nicht: 41
das: 38
in: 35
...
```
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: `Map<T>` verwenden # Lösung: `Set<T>` und dessen Implementierungen
Musterlösung: Musterlösung:
[pr2.collections.map](../../solutions/src/main/java/pr2/collections/map/) [pr2.collections.set](../../solutions/src/main/java/pr2/collections/set/)

View File

@ -1,18 +1,27 @@
# ReverserGeneric # CommandLineSorter
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
`Comparable` verstehen und nutzen. Sortieren von Collections.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.collections.reverser_generic](../sources/src/main/java/pr2/collections/reverser_generic/). Gehen Sie in das Paket [pr2.collections.sorter_1](../sources/src/main/java/pr2/collections/sorter_1/).
Schreiben Sie bitte eine generische Klasse `Reverser` mit einer Methode `reverse`, der man eine Liste (`java.util.List`) von Objekten übergeben kann und diese absteigend sortiert wird. Stellen Sie durch korrekte Wahl des Typ-Parameters sicher, dass die in der Liste gespeicherten Objekte das Interface `Comparable` implementieren. Schreiben Sie bitte eine Klasse `CommandLineSorter`, die eine Reihe von Wörtern auf der Kommandozeile als Parameter annimmt und diese dann alphabetisch sortiert wieder ausgibt.
Testen Sie Ihre Implementierung mit der Klasse `ReverserTest`. ```console
> java CommandLineSorter Albert Dieter Sigmund Thomas Frank Dieter Herbert
Albert
Dieter
Dieter
Frank
Herbert
Sigmund
Thomas
```
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: ReverserGeneric # Lösung: CommandLineSorter
Musterlösung: Musterlösung:
[pr2.collections.reverser_generic](../../solutions/src/main/java/pr2/collections/reverser_generic/) [pr2.collections.sorter_1](../../solutions/src/main/java/pr2/collections/sorter_1/)

View File

@ -1,18 +1,26 @@
# Strings umgekehrt sortieren: Reverser # CommandLineSorter -- Version 2
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
`Comparable` verstehen und nutzen. Sortieren von Collections.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.collections.reverser](../sources/src/main/java/pr2/collections/reverser/). Gehen Sie in das Paket [pr2.collections.sorter_2](../sources/src/main/java/pr2/collections/sorter_2/).
Schreiben Sie bitte eine Klasse `Reverser` mit einer Methode `reverse`, der man eine Liste (`java.util.List`) von `String` übergeben kann und die diese dann absteigend sortiert, d.h. als Erstes kommen die Einträge mit Z, dann die mit Y etc. Schreiben Sie bitte eine Klasse `CommandLineSorter`, die eine Reihe von Wörtern auf der Kommandozeile als Parameter annimmt und diese dann alphabetisch sortiert wieder ausgibt. Hierbei sollen alle Dubletten entfernt werden, d.h. es soll kein Wort doppelt in der Liste auftauchen.
Testen Sie Ihre Implementierung mit der Klasse `ReverserTest`. ```console
> java CommandLineSorter Albert Dieter Sigmund Dieter Thomas Frank Herbert
Albert
Dieter
Frank
Herbert
Sigmund
Thomas
```
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: Strings umgekehrt sortieren: Reverser # Lösung: CommandLineSorter -- Version 2
Musterlösung: Musterlösung:
[pr2.collections.reverser](../../solutions/src/main/java/pr2/collections/reverser/) [pr2.collections.sorter_2](../../solutions/src/main/java/pr2/collections/sorter_2/)

View File

@ -1,24 +1,22 @@
# `Set<T>` und dessen Implementierungen # `Comparator<T>` verwenden und Objekte sortieren
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Das Interface `Set<T>` und eine passende Implementierung einsetzen. Verschiedene Sortierreihenfolgen durch die Implementierung von `Comparator<T>` realisieren.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.collections.set](../sources/src/main/java/pr2/collections/set/). Gehen Sie in das Paket [pr2.collections.sortieren](../sources/src/main/java/pr2/collections/sortieren/).
Im Projekt finden Sie die Klasse `WordCollector` mit deren Hilfe man die Wörter in einem Text analysieren kann. Nach Übergabe eines Dateinamens wird die Datei eingelesen und die vorhandenen Wörter werden gesammelt. Am Ende wird die Liste der Wörter alphabetisch sortiert ausgegeben. Sie finden in der Aufgabe bereits die Klasse `Sorter` und den JUnit-Test `SorterTest` vor. Schauen Sie sich die Klasse `Sorter` an und versuchen Sie anhand der JavaDoc und des bereits vorhandenen Codes zu verstehen, was die Klasse machen soll.
Leider wurde `WordCollector` von einem Entwickler geschrieben, der nichts von dem Collection-Framework wusste und daher alles mit Array realisiert hat. Hierdurch sind einige sehr komplexe Konstruktionen entstanden. Lassen Sie den Test laufen. Sie werden feststellen, dass ein Testfall grün ist, obwohl in `Sorter` gar keine Implementierung vorhanden ist. Versuchen Sie herauszufinden, warum dies so ist.
Lassen Sie das Programm laufen und betrachten Sie die Ausgabe. Schauen Sie sich die Klasse `WordCollector` an und versuchen Sie die Funktionsweise und die Implementierung genau zu verstehen. Dieser Schritt ist wichtig, um die im Folgenden beschriebenen Änderungen an der Klasse vornehmen zu können, lassen Sie sich also Zeit für diesen Schritt. Fügen Sie nun den fehlenden Code in die Klasse `Sorter` ein, und geben Sie entsprechende `Comparator`-Objekte zurück, sodass die Daten entsprechend dem Parameter `order` sortiert werden können.
Ändern Sie die Klasse nun so, dass anstatt Arrays `Set<T>` und deren Implementierungen verwendet werden. Ändern Sie die Schnittstellen und Parameter der Methoden von `String[]` auf `Set<String>` bzw. `List<String>`. Modifizieren Sie auch die Implementierung der Methoden und versuchen Sie Arrays wo immer möglich durch Sets und Listen zu ersetzen. Schauen Sie sich auch die JavaDoc der Klassen `java.util.Arrays` und `java.util.Collections` an, um möglicherweise sehr hilfreiche Methoden zu finden. Lassen Sie erneut die Tests laufen. Es müssen alle Testfälle grün sein, bevor Sie die Lösung einchecken.
__Hinweis:__ Die Konstruktion `String[] words = line.toLowerCase().split("[,. ]");` können Sie nicht durch Listen ersetzen, da die `split`-Methode Arrays verwendet.
## Abgabe (optional) ## Abgabe (optional)

View File

@ -1,5 +1,5 @@
# Lösung: `Set<T>` und dessen Implementierungen # Lösung: `Comparator<T>` verwenden und Objekte sortieren
Musterlösung: Musterlösung:
[pr2.collections.set](../../solutions/src/main/java/pr2/collections/set/) [pr2.collections.sortieren](../../solutions/src/main/java/pr2/collections/sortieren/)

View File

@ -1,26 +1,30 @@
# CommandLineSorter # Wörterbuchprogramm
[Musterlösung](solution/) [Musterlösung](solution/)
## Lernziel ## Lernziel
Sortieren von Collections. Interface `Map` und seine Implementierungen einsetzen.
## Aufgabe ## Aufgabe
Gehen Sie in das Paket [pr2.collections.sorter_1](../sources/src/main/java/pr2/collections/sorter_1/). Gehen Sie in das Paket [pr2.collections.woerterbuch](../sources/src/main/java/pr2/collections/woerterbuch/).
Schreiben Sie bitte eine Klasse `CommandLineSorter`, die eine Reihe von Wörtern auf der Kommandozeile als Parameter annimmt und diese dann alphabetisch sortiert wieder ausgibt. Schreiben Sie ein einfaches Wörterbuchprogramm, dem man auf der Kommandozeile eine beliebige Anzahl von Wörtern übergeben kann und das dann die entsprechende Übersetzung ausgibt. Die Wörter des Wörterbuchs sollen fest im Programm einprogrammiert sein. Es reicht, wenn Sie einige wenige Wörter vorsehen.
Berücksichtigen Sie bitte den Fall, dass der Benutzer kein Wort auf der Kommandozeile angibt bzw. dass ein Wort nicht im Wörterbuch vorhanden ist.
```console ```console
> java CommandLineSorter Albert Dieter Sigmund Thomas Frank Dieter Herbert > java Woerterbuch
Albert Bitte mindestens ein Wort angeben!
Dieter ```
Dieter
Frank ```console
Herbert >java Woerterbuch gehen schlafen tanzen hopsen
Sigmund gehen => go
Thomas schlafen => sleep
tanzen => dance
hopsen => <unbekanntes Wort>
``` ```

View File

@ -1,5 +1,5 @@
# Lösung: CommandLineSorter # Lösung: Wörterbuchprogramm
Musterlösung: Musterlösung:
[pr2.collections.sorter_1](../../solutions/src/main/java/pr2/collections/sorter_1/) [pr2.collections.woerterbuch](../../solutions/src/main/java/pr2/collections/woerterbuch/)

View File

@ -1,35 +0,0 @@
# CommandLineSorter -- Version 2
[Musterlösung](solution/)
## Lernziel
Sortieren von Collections.
## Aufgabe
Gehen Sie in das Paket [pr2.collections.sorter_2](../sources/src/main/java/pr2/collections/sorter_2/).
Schreiben Sie bitte eine Klasse `CommandLineSorter`, die eine Reihe von Wörtern auf der Kommandozeile als Parameter annimmt und diese dann alphabetisch sortiert wieder ausgibt. Hierbei sollen alle Dubletten entfernt werden, d.h. es soll kein Wort doppelt in der Liste auftauchen.
```console
> java CommandLineSorter Albert Dieter Sigmund Dieter Thomas Frank Herbert
Albert
Dieter
Frank
Herbert
Sigmund
Thomas
```
## Abgabe (optional)
__Sie müssen keine Lösung für diese Aufgabe einreichen.__
Sie können Ihre Lösung aber auf die Konformität mit den Programmierstandards testen. Hierzu gehen Sie wie folgt vor:
1. Öffnen Sie eine Kommandozeile (Terminal).
2. Gehen Sie in Ihr Working Directory.
3. Wechseln Sie mit `cd` in das Verzeichnis `sources`.
4. Bauen Sie das Projekt mit dem Kommando `mvn`.

View File

@ -1,5 +0,0 @@
# Lösung: CommandLineSorter -- Version 2
Musterlösung:
[pr2.collections.sorter_2](../../solutions/src/main/java/pr2/collections/sorter_2/)

View File

@ -1,31 +0,0 @@
# `Comparator<T>` verwenden und Objekte sortieren
[Musterlösung](solution/)
## Lernziel
Verschiedene Sortierreihenfolgen durch die Implementierung von `Comparator<T>` realisieren.
## Aufgabe
Gehen Sie in das Paket [pr2.collections.sortieren](../sources/src/main/java/pr2/collections/sortieren/).
Sie finden in der Aufgabe bereits die Klasse `Sorter` und den JUnit-Test `SorterTest` vor. Schauen Sie sich die Klasse `Sorter` an und versuchen Sie anhand der JavaDoc und des bereits vorhandenen Codes zu verstehen, was die Klasse machen soll.
Lassen Sie den Test laufen. Sie werden feststellen, dass ein Testfall grün ist, obwohl in `Sorter` gar keine Implementierung vorhanden ist. Versuchen Sie herauszufinden, warum dies so ist.
Fügen Sie nun den fehlenden Code in die Klasse `Sorter` ein, und geben Sie entsprechende `Comparator`-Objekte zurück, sodass die Daten entsprechend dem Parameter `order` sortiert werden können.
Lassen Sie erneut die Tests laufen. Es müssen alle Testfälle grün sein, bevor Sie die Lösung einchecken.
## Abgabe (optional)
__Sie müssen keine Lösung für diese Aufgabe einreichen.__
Sie können Ihre Lösung aber auf die Konformität mit den Programmierstandards testen. Hierzu gehen Sie wie folgt vor:
1. Öffnen Sie eine Kommandozeile (Terminal).
2. Gehen Sie in Ihr Working Directory.
3. Wechseln Sie mit `cd` in das Verzeichnis `sources`.
4. Bauen Sie das Projekt mit dem Kommando `mvn`.

View File

@ -1,5 +0,0 @@
# Lösung: `Comparator<T>` verwenden und Objekte sortieren
Musterlösung:
[pr2.collections.sortieren](../../solutions/src/main/java/pr2/collections/sortieren/)

View File

@ -1,40 +0,0 @@
# Wörterbuchprogramm
[Musterlösung](solution/)
## Lernziel
Interface `Map` und seine Implementierungen einsetzen.
## Aufgabe
Gehen Sie in das Paket [pr2.collections.woerterbuch](../sources/src/main/java/pr2/collections/woerterbuch/).
Schreiben Sie ein einfaches Wörterbuchprogramm, dem man auf der Kommandozeile eine beliebige Anzahl von Wörtern übergeben kann und das dann die entsprechende Übersetzung ausgibt. Die Wörter des Wörterbuchs sollen fest im Programm einprogrammiert sein. Es reicht, wenn Sie einige wenige Wörter vorsehen.
Berücksichtigen Sie bitte den Fall, dass der Benutzer kein Wort auf der Kommandozeile angibt bzw. dass ein Wort nicht im Wörterbuch vorhanden ist.
```console
> java Woerterbuch
Bitte mindestens ein Wort angeben!
```
```console
>java Woerterbuch gehen schlafen tanzen hopsen
gehen => go
schlafen => sleep
tanzen => dance
hopsen => <unbekanntes Wort>
```
## Abgabe (optional)
__Sie müssen keine Lösung für diese Aufgabe einreichen.__
Sie können Ihre Lösung aber auf die Konformität mit den Programmierstandards testen. Hierzu gehen Sie wie folgt vor:
1. Öffnen Sie eine Kommandozeile (Terminal).
2. Gehen Sie in Ihr Working Directory.
3. Wechseln Sie mit `cd` in das Verzeichnis `sources`.
4. Bauen Sie das Projekt mit dem Kommando `mvn`.

View File

@ -1,5 +0,0 @@
# Lösung: Wörterbuchprogramm
Musterlösung:
[pr2.collections.woerterbuch](../../solutions/src/main/java/pr2/collections/woerterbuch/)

View File

@ -81,27 +81,24 @@ Hinweise zur nötigen Softwareausstattung finden Sie [hier](help/softwareausstat
| 71. | n/a | [`super` und `extends` einsetzen](Assignment_071/readme.md) | [](Assignment_071/solution/) | | 71. | n/a | [`super` und `extends` einsetzen](Assignment_071/readme.md) | [](Assignment_071/solution/) |
| 72. | n/a | [Generischen Typ verwenden](Assignment_072/readme.md) | [](Assignment_072/solution/) | | 72. | n/a | [Generischen Typ verwenden](Assignment_072/readme.md) | [](Assignment_072/solution/) |
| 73. | n/a | [Generische Typen zusammen mit Wildcards einsetzen](Assignment_073/readme.md) | [](Assignment_073/solution/) | | 73. | n/a | [Generische Typen zusammen mit Wildcards einsetzen](Assignment_073/readme.md) | [](Assignment_073/solution/) |
| 74. | n/a | [Anonyme Klasse schreiben](Assignment_074/readme.md) | [](Assignment_074/solution/) | | 74. | n/a | [Eigene compare-Methode schreiben](Assignment_074/readme.md) | [](Assignment_074/solution/) |
| 75. | n/a | [Eigene compare-Methode schreiben](Assignment_075/readme.md) | [](Assignment_075/solution/) | | 75. | n/a | [Innere Klasse Beobachter](Assignment_075/readme.md) | [](Assignment_075/solution/) |
| 76. | n/a | [Innere Klasse Beobachter](Assignment_076/readme.md) | [](Assignment_076/solution/) | | 76. | n/a | [Callback mit anonymer Klasse realisieren](Assignment_076/readme.md) | [](Assignment_076/solution/) |
| 77. | n/a | [Callback mit anonymer Klasse realisieren](Assignment_077/readme.md) | [](Assignment_077/solution/) | | 77. | n/a | [Comparator als Lambda](Assignment_077/readme.md) | [](Assignment_077/solution/) |
| 78. | n/a | [Comparator als Lambda](Assignment_078/readme.md) | [](Assignment_078/solution/) | | 78. | n/a | [Callback mit Lambda realisieren](Assignment_078/readme.md) | [](Assignment_078/solution/) |
| 79. | n/a | [Callback mit Lambda realisieren](Assignment_079/readme.md) | [](Assignment_079/solution/) | | 79. | n/a | [MatrixSuche](Assignment_079/readme.md) | [](Assignment_079/solution/) |
| 80. | n/a | [Lokale Klasse schreiben](Assignment_080/readme.md) | [](Assignment_080/solution/) | | 80. | n/a | [StringTransmogrifier](Assignment_080/readme.md) | [](Assignment_080/solution/) |
| 81. | n/a | [MatrixSuche](Assignment_081/readme.md) | [](Assignment_081/solution/) | | 81. | n/a | [StringTransmogrifier erweitern](Assignment_081/readme.md) | [](Assignment_081/solution/) |
| 82. | n/a | [StringTransmogrifier](Assignment_082/readme.md) | [](Assignment_082/solution/) | | 82. | n/a | [Static Member Class](Assignment_082/readme.md) | [](Assignment_082/solution/) |
| 83. | n/a | [StringTransmogrifier erweitern](Assignment_083/readme.md) | [](Assignment_083/solution/) | | 83. | n/a | [Iterator schreiben](Assignment_083/readme.md) | [](Assignment_083/solution/) |
| 84. | n/a | [Nonstatic Member Class](Assignment_084/readme.md) | [](Assignment_084/solution/) | | 84. | n/a | [Mithilfe eines Iterators über Daten iterieren](Assignment_084/readme.md) | [](Assignment_084/solution/) |
| 85. | n/a | [Static Member Class](Assignment_085/readme.md) | [](Assignment_085/solution/) | | 85. | n/a | [Iterator programmieren](Assignment_085/readme.md) | [](Assignment_085/solution/) |
| 86. | n/a | [Iterator schreiben](Assignment_086/readme.md) | [](Assignment_086/solution/) | | 86. | n/a | [`List<T>` und dessen Implementierungen](Assignment_086/readme.md) | [](Assignment_086/solution/) |
| 87. | n/a | [Mithilfe eines Iterators über Daten iterieren](Assignment_087/readme.md) | [](Assignment_087/solution/) | | 87. | n/a | [`Map<T>` verwenden](Assignment_087/readme.md) | [](Assignment_087/solution/) |
| 88. | n/a | [Iterator programmieren](Assignment_088/readme.md) | [](Assignment_088/solution/) | | 88. | n/a | [ReverserGeneric](Assignment_088/readme.md) | [](Assignment_088/solution/) |
| 89. | n/a | [`List<T>` und dessen Implementierungen](Assignment_089/readme.md) | [](Assignment_089/solution/) | | 89. | n/a | [Strings umgekehrt sortieren: Reverser](Assignment_089/readme.md) | [](Assignment_089/solution/) |
| 90. | n/a | [`Map<T>` verwenden](Assignment_090/readme.md) | [](Assignment_090/solution/) | | 90. | n/a | [`Set<T>` und dessen Implementierungen](Assignment_090/readme.md) | [](Assignment_090/solution/) |
| 91. | n/a | [ReverserGeneric](Assignment_091/readme.md) | [](Assignment_091/solution/) | | 91. | n/a | [CommandLineSorter](Assignment_091/readme.md) | [](Assignment_091/solution/) |
| 92. | n/a | [Strings umgekehrt sortieren: Reverser](Assignment_092/readme.md) | [](Assignment_092/solution/) | | 92. | n/a | [CommandLineSorter -- Version 2](Assignment_092/readme.md) | [](Assignment_092/solution/) |
| 93. | n/a | [`Set<T>` und dessen Implementierungen](Assignment_093/readme.md) | [](Assignment_093/solution/) | | 93. | n/a | [`Comparator<T>` verwenden und Objekte sortieren](Assignment_093/readme.md) | [](Assignment_093/solution/) |
| 94. | n/a | [CommandLineSorter](Assignment_094/readme.md) | [](Assignment_094/solution/) | | 94. | n/a | [Wörterbuchprogramm](Assignment_094/readme.md) | [](Assignment_094/solution/) |
| 95. | n/a | [CommandLineSorter -- Version 2](Assignment_095/readme.md) | [](Assignment_095/solution/) |
| 96. | n/a | [`Comparator<T>` verwenden und Objekte sortieren](Assignment_096/readme.md) | [](Assignment_096/solution/) |
| 97. | n/a | [Wörterbuchprogramm](Assignment_097/readme.md) | [](Assignment_097/solution/) |

View File

@ -1,46 +0,0 @@
package pr2.lambda.anonymous;
import de.smits_net.games.framework.board.Board;
import de.smits_net.games.framework.image.AnimatedImage;
import de.smits_net.games.framework.image.ImagePack;
import de.smits_net.games.framework.image.StripedImage;
import de.smits_net.games.framework.sprite.AnimatedSprite;
import de.smits_net.games.framework.sprite.Direction;
import java.awt.Point;
/**
* Ein Alien.
*/
public class Alien extends AnimatedSprite {
/**
* Geschwindigkeit des Aliens X-Richtung.
*/
private static final int ALIEN_SPEED = 2;
/**
* Neues Alien anlegen.
*
* @param board das Spielfeld
* @param startPoint Start-Position
*/
public Alien(Board board, Point startPoint) {
super(board, startPoint, BoundaryPolicy.JUMP_BACK,
new AnimatedImage(50,
new ImagePack("pr2/lambda/anonymous/",
"ship01", "ship02", "ship03")));
velocity.setVelocity(Direction.WEST, ALIEN_SPEED);
}
/**
* Alien explodieren lassen.
*/
public void explode() {
setActive(false);
setImages(new AnimatedImage(20,
new StripedImage("pr2/lambda/anonymous/explosion_1" + ".png",
43)));
setInvisibleAfterFrames(70);
}
}

View File

@ -1,73 +0,0 @@
package pr2.lambda.anonymous;
import de.smits_net.games.framework.board.Board;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
/**
* Spielfeld.
*/
public class GameBoard extends Board {
/**
* Alien, das durch das Bild läuft.
*/
Alien alien; // nicht private wegen des Zugriffs aus der inneren Klasse
/**
* Erzeugt ein neues Board.
*/
public GameBoard() {
// neues Spielfeld anlegen
super(10, new Dimension(800, 300), Color.BLACK);
// Alien initialisieren
alien = new Alien(this,
new Point(800, 50 + new Random().nextInt(100)));
// Event-Handler für Clicks.
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (alien.intersects(e.getPoint())) {
alien.explode();
}
else {
alien.setPosition(e.getPoint());
}
}
});
}
/**
* Spielfeld neu zeichnen. Wird vom Framework aufgerufen.
*/
@Override
public void drawGame(Graphics g) {
// Alien zeichnen
alien.draw(g, this);
}
/**
* Game-Over-Text anzeigen. Wird vom Framework aufgerufen.
*/
@Override
public void drawGameOver(Graphics g) {
centerText(g, "Das Spiel ist aus!");
}
/**
* Spielsituation updaten. Wird vom Framework aufgerufen.
*/
@Override
public boolean updateGame() {
alien.move();
return alien.isVisible();
}
}

View File

@ -1,28 +0,0 @@
package pr2.lambda.anonymous;
import de.smits_net.games.framework.board.MainWindow;
import java.awt.EventQueue;
/**
* Hauptklasse des Spiels.
*/
public class GameMain extends MainWindow {
/**
* Neues Spiel anlegen.
*/
public GameMain() {
super("Click Alien - (04) Anonymous Class", new GameBoard());
}
/**
* Startpunkt.
*
* @param args command line arguments.
*/
public static void main(String[] args) {
EventQueue.invokeLater(GameMain::new);
}
}

View File

@ -1,46 +0,0 @@
package pr2.lambda.local;
import de.smits_net.games.framework.board.Board;
import de.smits_net.games.framework.image.AnimatedImage;
import de.smits_net.games.framework.image.ImagePack;
import de.smits_net.games.framework.image.StripedImage;
import de.smits_net.games.framework.sprite.AnimatedSprite;
import de.smits_net.games.framework.sprite.Direction;
import java.awt.Point;
/**
* Ein Alien.
*/
public class Alien extends AnimatedSprite {
/**
* Geschwindigkeit des Aliens X-Richtung.
*/
private static final int ALIEN_SPEED = 2;
/**
* Neues Alien anlegen.
*
* @param board das Spielfeld
* @param startPoint Start-Position
*/
public Alien(Board board, Point startPoint) {
super(board, startPoint, BoundaryPolicy.JUMP_BACK,
new AnimatedImage(50,
new ImagePack("pr2/lambda/local/",
"ship01", "ship02", "ship03")));
velocity.setVelocity(Direction.WEST, ALIEN_SPEED);
}
/**
* Alien explodieren lassen.
*/
public void explode() {
setActive(false);
setImages(new AnimatedImage(20,
new StripedImage("pr2/lambda/local/explosion_1" + ".png",
43)));
setInvisibleAfterFrames(70);
}
}

View File

@ -1,72 +0,0 @@
package pr2.lambda.local;
import de.smits_net.games.framework.board.Board;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
/**
* Spielfeld.
*/
public class GameBoard extends Board {
/**
* Alien, das durch das Bild läuft.
*/
Alien alien; // nicht private wegen Zugriff aus innerer Klasse
/**
* Erzeugt ein neues Board.
*/
public GameBoard() {
// neues Spielfeld anlegen
super(10, new Dimension(800, 300), Color.BLACK);
// Alien initialisieren
alien = new Alien(this,
new Point(800, 50 + new Random().nextInt(100)));
/* Event-Handler für Clicks. */
class AlienExploder extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
if (alien.intersects(e.getPoint())) {
alien.explode();
}
}
}
addMouseListener(new AlienExploder());
}
/**
* Spielfeld neu zeichnen. Wird vom Framework aufgerufen.
*/
@Override
public void drawGame(Graphics g) {
// Alien zeichnen
alien.draw(g, this);
}
/**
* Game-Over-Text anzeigen. Wird vom Framework aufgerufen.
*/
@Override
public void drawGameOver(Graphics g) {
centerText(g, "Das Spiel ist aus!");
}
/**
* Spielsituation updaten. Wird vom Framework aufgerufen.
*/
@Override
public boolean updateGame() {
alien.move();
return alien.isVisible();
}
}

View File

@ -1,28 +0,0 @@
package pr2.lambda.local;
import de.smits_net.games.framework.board.MainWindow;
import java.awt.EventQueue;
/**
* Hauptklasse des Spiels.
*/
public class GameMain extends MainWindow {
/**
* Neues Spiel anlegen.
*/
public GameMain() {
super("Click Alien - (03) Local Class", new GameBoard());
}
/**
* Startpunkt.
*
* @param args command line arguments.
*/
public static void main(String[] args) {
EventQueue.invokeLater(GameMain::new);
}
}

View File

@ -1,54 +0,0 @@
package pr2.lambda.nonstatic;
import de.smits_net.games.framework.board.Board;
import de.smits_net.games.framework.image.AnimatedImage;
import de.smits_net.games.framework.image.ImagePack;
import de.smits_net.games.framework.image.StripedImage;
import de.smits_net.games.framework.sprite.AnimatedSprite;
import de.smits_net.games.framework.sprite.Direction;
import java.awt.Point;
/**
* Ein Alien.
*/
public class Alien extends AnimatedSprite {
/**
* Geschwindigkeit des Aliens X-Richtung.
*/
private static final int ALIEN_SPEED = 2;
/**
* Neues Alien anlegen.
*
* @param board das Spielfeld
* @param startPoint Start-Position
*/
public Alien(Board board, Point startPoint) {
super(board, startPoint, BoundaryPolicy.JUMP_BACK,
new AnimatedImage(50,
new ImagePack("pr2/lambda/static_member",
"ship01", "ship02", "ship03")));
velocity.setVelocity(Direction.WEST, ALIEN_SPEED);
}
/**
* Alien explodieren lassen.
*/
public void explode() {
setActive(false);
setImages(new AnimatedImage(20,
new StripedImage("pr2/lambda/static_member/explosion_1.png",
43)));
setInvisibleAfterFrames(70);
}
/**
* Klick auf das Alien lässt es explodieren.
*/
@Override
public void mousePressed() {
explode();
}
}

View File

@ -1,108 +0,0 @@
package pr2.lambda.nonstatic;
import de.smits_net.games.framework.board.Board;
import de.smits_net.games.framework.image.AnimatedImage;
import de.smits_net.games.framework.image.ImagePack;
import de.smits_net.games.framework.image.StripedImage;
import de.smits_net.games.framework.sprite.AnimatedSprite;
import de.smits_net.games.framework.sprite.Direction;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.util.Random;
/**
* Spielfeld.
*/
public class GameBoard extends Board {
/**
* Alien, das durch das Bild läuft.
*/
private final Alien alien;
/**
* Erzeugt ein neues Board.
*/
public GameBoard() {
// neues Spielfeld anlegen
super(10, new Dimension(800, 300), Color.BLACK);
// Alien initialisieren
alien = new Alien(new Point(800, 50 + new Random().nextInt(100)));
}
/**
* Spielfeld neu zeichnen. Wird vom Framework aufgerufen.
*/
@Override
public void drawGame(Graphics g) {
// Alien zeichnen
alien.draw(g, this);
}
/**
* Game-Over-Text anzeigen. Wird vom Framework aufgerufen.
*/
@Override
public void drawGameOver(Graphics g) {
centerText(g, "Das Spiel ist aus!");
}
/**
* Spielsituation updaten. Wird vom Framework aufgerufen.
*/
@Override
public boolean updateGame() {
alien.move();
return alien.isVisible();
}
/**
* Ein Alien.
*/
public class Alien extends AnimatedSprite {
/**
* Geschwindigkeit des Alien X-Richtung.
*/
private static final int ALIEN_SPEED = 2;
/**
* Neues Alien anlegen.
*
* @param startPoint Start-Position
*/
public Alien(Point startPoint) {
super(GameBoard.this, startPoint, BoundaryPolicy.JUMP_BACK,
new AnimatedImage(50,
new ImagePack("assets", "ship01", "ship02",
"ship03")));
velocity.setVelocity(Direction.WEST, ALIEN_SPEED);
GameBoard.this.addMouseListener(this);
}
/**
* Alien explodieren lassen.
*/
public void explode() {
setActive(false);
setImages(new AnimatedImage(20,
new StripedImage("assets" + "/explosion_1.png", 43)));
setInvisibleAfterFrames(70);
}
/**
* Klick auf das Alien lässt es explodieren.
*/
@Override
public void mousePressed() {
explode();
}
}
}

View File

@ -1,27 +0,0 @@
package pr2.lambda.nonstatic;
import de.smits_net.games.framework.board.MainWindow;
import java.awt.EventQueue;
/**
* Hauptklasse des Spiels.
*/
public class GameMain extends MainWindow {
/**
* Neues Spiel anlegen.
*/
public GameMain() {
super("Click Alien - (02) Nonstatic Member", new GameBoard());
}
/**
* Startpunkt.
*
* @param args command line arguments.
*/
public static void main(String[] args) {
EventQueue.invokeLater(GameMain::new);
}
}

View File

@ -1,46 +0,0 @@
package pr2.lambda.anonymous;
import de.smits_net.games.framework.board.Board;
import de.smits_net.games.framework.image.AnimatedImage;
import de.smits_net.games.framework.image.ImagePack;
import de.smits_net.games.framework.image.StripedImage;
import de.smits_net.games.framework.sprite.AnimatedSprite;
import de.smits_net.games.framework.sprite.Direction;
import java.awt.Point;
/**
* Ein Alien.
*/
public class Alien extends AnimatedSprite {
/**
* Geschwindigkeit des Aliens X-Richtung.
*/
private static final int ALIEN_SPEED = 2;
/**
* Neues Alien anlegen.
*
* @param board das Spielfeld
* @param startPoint Start-Position
*/
public Alien(Board board, Point startPoint) {
super(board, startPoint, BoundaryPolicy.JUMP_BACK,
new AnimatedImage(50,
new ImagePack("pr2/lambda/anonymous/",
"ship01", "ship02", "ship03")));
velocity.setVelocity(Direction.WEST, ALIEN_SPEED);
}
/**
* Alien explodieren lassen.
*/
public void explode() {
setActive(false);
setImages(new AnimatedImage(20,
new StripedImage("pr2/lambda/anonymous/explosion_1" + ".png",
43)));
setInvisibleAfterFrames(70);
}
}

View File

@ -1,62 +0,0 @@
package pr2.lambda.anonymous;
import de.smits_net.games.framework.board.Board;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
/**
* Spielfeld.
*/
public class GameBoard extends Board {
/**
* Alien, das durch das Bild läuft.
*/
Alien alien; // nicht private wegen des Zugriffs aus der inneren Klasse
/**
* Erzeugt ein neues Board.
*/
public GameBoard() {
// neues Spielfeld anlegen
super(10, new Dimension(800, 300), Color.BLACK);
// Alien initialisieren
alien = new Alien(this,
new Point(800, 50 + new Random().nextInt(100)));
// TODO: Event-Handler hier erstellen
}
/**
* Spielfeld neu zeichnen. Wird vom Framework aufgerufen.
*/
@Override
public void drawGame(Graphics g) {
// Alien zeichnen
alien.draw(g, this);
}
/**
* Game-Over-Text anzeigen. Wird vom Framework aufgerufen.
*/
@Override
public void drawGameOver(Graphics g) {
centerText(g, "Das Spiel ist aus!");
}
/**
* Spielsituation updaten. Wird vom Framework aufgerufen.
*/
@Override
public boolean updateGame() {
alien.move();
return alien.isVisible();
}
}

View File

@ -1,28 +0,0 @@
package pr2.lambda.anonymous;
import de.smits_net.games.framework.board.MainWindow;
import java.awt.EventQueue;
/**
* Hauptklasse des Spiels.
*/
public class GameMain extends MainWindow {
/**
* Neues Spiel anlegen.
*/
public GameMain() {
super("Click Alien - (04) Anonymous Class", new GameBoard());
}
/**
* Startpunkt.
*
* @param args command line arguments.
*/
public static void main(String[] args) {
EventQueue.invokeLater(GameMain::new);
}
}

View File

@ -1,46 +0,0 @@
package pr2.lambda.local;
import de.smits_net.games.framework.board.Board;
import de.smits_net.games.framework.image.AnimatedImage;
import de.smits_net.games.framework.image.ImagePack;
import de.smits_net.games.framework.image.StripedImage;
import de.smits_net.games.framework.sprite.AnimatedSprite;
import de.smits_net.games.framework.sprite.Direction;
import java.awt.Point;
/**
* Ein Alien.
*/
public class Alien extends AnimatedSprite {
/**
* Geschwindigkeit des Aliens X-Richtung.
*/
private static final int ALIEN_SPEED = 2;
/**
* Neues Alien anlegen.
*
* @param board das Spielfeld
* @param startPoint Start-Position
*/
public Alien(Board board, Point startPoint) {
super(board, startPoint, BoundaryPolicy.JUMP_BACK,
new AnimatedImage(50,
new ImagePack("pr2/lambda/local/",
"ship01", "ship02", "ship03")));
velocity.setVelocity(Direction.WEST, ALIEN_SPEED);
}
/**
* Alien explodieren lassen.
*/
public void explode() {
setActive(false);
setImages(new AnimatedImage(20,
new StripedImage("pr2/lambda/local/explosion_1" + ".png",
43)));
setInvisibleAfterFrames(70);
}
}

View File

@ -1,62 +0,0 @@
package pr2.lambda.local;
import de.smits_net.games.framework.board.Board;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
/**
* Spielfeld.
*/
public class GameBoard extends Board {
/**
* Alien, das durch das Bild läuft.
*/
Alien alien; // nicht private wegen Zugriff aus innerer Klasse
/**
* Erzeugt ein neues Board.
*/
public GameBoard() {
// neues Spielfeld anlegen
super(10, new Dimension(800, 300), Color.BLACK);
// Alien initialisieren
alien = new Alien(this,
new Point(800, 50 + new Random().nextInt(100)));
// TODO: AlienExploder hier einfügen
}
/**
* Spielfeld neu zeichnen. Wird vom Framework aufgerufen.
*/
@Override
public void drawGame(Graphics g) {
// Alien zeichnen
alien.draw(g, this);
}
/**
* Game-Over-Text anzeigen. Wird vom Framework aufgerufen.
*/
@Override
public void drawGameOver(Graphics g) {
centerText(g, "Das Spiel ist aus!");
}
/**
* Spielsituation updaten. Wird vom Framework aufgerufen.
*/
@Override
public boolean updateGame() {
alien.move();
return alien.isVisible();
}
}

View File

@ -1,28 +0,0 @@
package pr2.lambda.local;
import de.smits_net.games.framework.board.MainWindow;
import java.awt.EventQueue;
/**
* Hauptklasse des Spiels.
*/
public class GameMain extends MainWindow {
/**
* Neues Spiel anlegen.
*/
public GameMain() {
super("Click Alien - (03) Local Class", new GameBoard());
}
/**
* Startpunkt.
*
* @param args command line arguments.
*/
public static void main(String[] args) {
EventQueue.invokeLater(GameMain::new);
}
}

View File

@ -1,54 +0,0 @@
package pr2.lambda.nonstatic;
import de.smits_net.games.framework.board.Board;
import de.smits_net.games.framework.image.AnimatedImage;
import de.smits_net.games.framework.image.ImagePack;
import de.smits_net.games.framework.image.StripedImage;
import de.smits_net.games.framework.sprite.AnimatedSprite;
import de.smits_net.games.framework.sprite.Direction;
import java.awt.Point;
/**
* Ein Alien.
*/
public class Alien extends AnimatedSprite {
/**
* Geschwindigkeit des Aliens X-Richtung.
*/
private static final int ALIEN_SPEED = 2;
/**
* Neues Alien anlegen.
*
* @param board das Spielfeld
* @param startPoint Start-Position
*/
public Alien(Board board, Point startPoint) {
super(board, startPoint, BoundaryPolicy.JUMP_BACK,
new AnimatedImage(50,
new ImagePack("pr2/lambda/static_member",
"ship01", "ship02", "ship03")));
velocity.setVelocity(Direction.WEST, ALIEN_SPEED);
}
/**
* Alien explodieren lassen.
*/
public void explode() {
setActive(false);
setImages(new AnimatedImage(20,
new StripedImage("pr2/lambda/static_member/explosion_1.png",
43)));
setInvisibleAfterFrames(70);
}
/**
* Klick auf das Alien lässt es explodieren.
*/
@Override
public void mousePressed() {
explode();
}
}

View File

@ -1,67 +0,0 @@
package pr2.lambda.nonstatic;
import de.smits_net.games.framework.board.Board;
import de.smits_net.games.framework.image.AnimatedImage;
import de.smits_net.games.framework.image.ImagePack;
import de.smits_net.games.framework.image.StripedImage;
import de.smits_net.games.framework.sprite.AnimatedSprite;
import de.smits_net.games.framework.sprite.Direction;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.util.Random;
/**
* Spielfeld.
*/
public class GameBoard extends Board {
/**
* Alien, das durch das Bild läuft.
*/
private final Alien alien;
/**
* Erzeugt ein neues Board.
*/
public GameBoard() {
// neues Spielfeld anlegen
super(10, new Dimension(800, 300), Color.BLACK);
// Alien initialisieren
alien = new Alien(this, new Point(800, 50 + new Random().nextInt(100)));
// Alien soll auf Maus-Klicks reagieren
addMouseListener(alien);
}
/**
* Spielfeld neu zeichnen. Wird vom Framework aufgerufen.
*/
@Override
public void drawGame(Graphics g) {
// Alien zeichnen
alien.draw(g, this);
}
/**
* Game-Over-Text anzeigen. Wird vom Framework aufgerufen.
*/
@Override
public void drawGameOver(Graphics g) {
centerText(g, "Das Spiel ist aus!");
}
/**
* Spielsituation updaten. Wird vom Framework aufgerufen.
*/
@Override
public boolean updateGame() {
alien.move();
return alien.isVisible();
}
// TODO: Alien zu einer non-static class machen
}

View File

@ -1,27 +0,0 @@
package pr2.lambda.nonstatic;
import de.smits_net.games.framework.board.MainWindow;
import java.awt.EventQueue;
/**
* Hauptklasse des Spiels.
*/
public class GameMain extends MainWindow {
/**
* Neues Spiel anlegen.
*/
public GameMain() {
super("Click Alien - (02) Nonstatic Member", new GameBoard());
}
/**
* Startpunkt.
*
* @param args command line arguments.
*/
public static void main(String[] args) {
EventQueue.invokeLater(GameMain::new);
}
}