From 54d2661c6680a374ec57440df403cac1b252e616 Mon Sep 17 00:00:00 2001 From: Thomas Smits Date: Sun, 21 Jan 2024 13:36:56 +0100 Subject: [PATCH] Update of exercises --- .../img/schnick.png | Bin Assignment_041/readme.md | 46 ++++- Assignment_041/solution/readme.md | 4 +- Assignment_042/readme.md | 34 +--- Assignment_042/solution/readme.md | 4 +- Assignment_043/readme.md | 16 +- Assignment_043/solution/readme.md | 4 +- Assignment_044/readme.md | 16 +- Assignment_044/solution/readme.md | 4 +- Assignment_045/readme.md | 13 +- Assignment_045/solution/readme.md | 4 +- Assignment_046/readme.md | 13 +- Assignment_046/solution/readme.md | 4 +- {Assignment_048 => Assignment_047}/kafka.txt | 0 Assignment_047/readme.md | 21 ++- Assignment_047/solution/readme.md | 4 +- Assignment_048/readme.md | 23 ++- Assignment_048/solution/readme.md | 4 +- Assignment_049/readme.md | 20 +-- Assignment_049/solution/readme.md | 4 +- Assignment_050/readme.md | 33 +++- Assignment_050/solution/readme.md | 4 +- {Assignment_052 => Assignment_051}/daten.dat | Bin Assignment_051/readme.md | 33 +--- Assignment_051/solution/readme.md | 4 +- Assignment_052/readme.md | 18 +- Assignment_052/solution/readme.md | 4 +- Assignment_053/readme.md | 27 ++- Assignment_053/solution/readme.md | 4 +- Assignment_054/readme.md | 37 ++-- Assignment_054/solution/readme.md | 4 +- Assignment_055/readme.md | 24 +-- Assignment_055/solution/readme.md | 4 +- Assignment_056/readme.md | 12 +- Assignment_056/solution/readme.md | 4 +- Assignment_057/readme.md | 15 +- Assignment_057/solution/readme.md | 4 +- {Assignment_059 => Assignment_058}/data.dat | Bin Assignment_058/readme.md | 17 +- Assignment_058/solution/readme.md | 4 +- {Assignment_060 => Assignment_059}/kafka.txt | 0 Assignment_059/readme.md | 14 +- Assignment_059/solution/readme.md | 4 +- Assignment_060/readme.md | 18 +- Assignment_060/solution/readme.md | 4 +- Assignment_061/readme.md | 25 +-- Assignment_061/solution/readme.md | 4 +- Assignment_062/readme.md | 27 ++- Assignment_062/solution/readme.md | 4 +- .../testdata.dat | Bin Assignment_063/readme.md | 16 +- Assignment_063/solution/readme.md | 4 +- Assignment_064/readme.md | 14 +- Assignment_064/solution/readme.md | 4 +- Assignment_065/readme.md | 6 +- Assignment_065/solution/readme.md | 4 +- Assignment_066/readme.md | 6 +- Assignment_066/solution/readme.md | 4 +- Assignment_067/readme.md | 8 +- Assignment_067/solution/readme.md | 4 +- Assignment_068/readme.md | 10 +- Assignment_068/solution/readme.md | 4 +- Assignment_069/readme.md | 12 +- Assignment_069/solution/readme.md | 4 +- Assignment_070/readme.md | 17 +- Assignment_070/solution/readme.md | 4 +- Assignment_071/readme.md | 32 +++- Assignment_071/solution/readme.md | 4 +- Assignment_072/readme.md | 14 +- Assignment_072/solution/readme.md | 4 +- Assignment_073/readme.md | 31 +--- Assignment_073/solution/readme.md | 4 +- Assignment_074/readme.md | 12 +- Assignment_074/solution/readme.md | 4 +- Assignment_075/readme.md | 13 +- Assignment_075/solution/readme.md | 4 +- Assignment_076/readme.md | 10 +- Assignment_076/solution/readme.md | 4 +- Assignment_077/readme.md | 11 +- Assignment_077/solution/readme.md | 4 +- Assignment_078/readme.md | 16 +- Assignment_078/solution/readme.md | 4 +- Assignment_079/readme.md | 10 +- Assignment_079/solution/readme.md | 4 +- Assignment_080/readme.md | 16 +- Assignment_080/solution/readme.md | 4 +- Assignment_081/readme.md | 10 +- Assignment_081/solution/readme.md | 4 +- Assignment_082/kafka.txt | 11 ++ Assignment_082/readme.md | 18 +- Assignment_082/solution/readme.md | 4 +- Assignment_083/kafka.txt | 11 ++ Assignment_083/readme.md | 32 +++- Assignment_083/solution/readme.md | 4 +- Assignment_084/readme.md | 14 +- Assignment_084/solution/readme.md | 4 +- Assignment_085/readme.md | 10 +- Assignment_085/solution/readme.md | 4 +- Assignment_086/kafka.txt | 11 ++ Assignment_086/readme.md | 10 +- Assignment_086/solution/readme.md | 4 +- Assignment_087/readme.md | 35 ++-- Assignment_087/solution/readme.md | 4 +- Assignment_088/readme.md | 18 +- Assignment_088/solution/readme.md | 4 +- Assignment_089/readme.md | 14 +- Assignment_089/solution/readme.md | 4 +- Assignment_090/readme.md | 25 ++- Assignment_090/solution/readme.md | 4 +- Assignment_091/readme.md | 36 ---- Assignment_091/solution/readme.md | 5 - Assignment_092/readme.md | 35 ---- Assignment_092/solution/readme.md | 5 - Assignment_093/readme.md | 31 ---- Assignment_093/solution/readme.md | 5 - Assignment_094/readme.md | 40 ----- Assignment_094/solution/readme.md | 5 - readme.md | 104 ++++++----- .../collections/iterieren/CoinGenerator.java | 115 ------------ .../pr2/collections/iterieren/GameBoard.java | 66 ------- .../pr2/collections/iterieren/GameMain.java | 28 --- .../pr2/collections/list/WordCollector.java | 4 +- .../java/pr2/collections/map/WordCount.java | 2 +- .../pr2/collections/set/WordCollector.java | 2 +- .../java/pr2/enums/verwenden/GameBoard.java | 47 ----- .../java/pr2/enums/verwenden/GameMain.java | 28 --- .../java/pr2/enums/verwenden/Professor.java | 32 ---- .../pr2/generics/verwenden/GameBoard.java | 169 ------------------ .../java/pr2/generics/verwenden/GameMain.java | 28 --- .../java/pr2/lambda/static_member/Alien.java | 54 ------ .../pr2/lambda/static_member/GameBoard.java | 111 ------------ .../pr2/lambda/static_member/GameMain.java | 27 --- .../collections/iterieren/CoinGenerator.java | 115 ------------ .../pr2/collections/iterieren/GameBoard.java | 59 ------ .../pr2/collections/iterieren/GameMain.java | 28 --- .../pr2/collections/list/WordCollector.java | 2 +- .../java/pr2/collections/map/WordCount.java | 2 +- .../pr2/collections/set/WordCollector.java | 2 +- .../java/pr2/enums/verwenden/GameBoard.java | 47 ----- .../java/pr2/enums/verwenden/GameMain.java | 28 --- .../java/pr2/enums/verwenden/Professor.java | 32 ---- .../pr2/generics/verwenden/GameBoard.java | 166 ----------------- .../java/pr2/generics/verwenden/GameMain.java | 28 --- .../java/pr2/lambda/static_member/Alien.java | 54 ------ .../pr2/lambda/static_member/GameBoard.java | 68 ------- .../pr2/lambda/static_member/GameMain.java | 27 --- .../resources/pr2/collections/list/kafka.txt | 2 +- .../resources/pr2/collections/map/kafka.txt | 2 +- .../resources/pr2/collections/set/kafka.txt | 2 +- .../{reduce => reduce_critics}/games.txt | 0 150 files changed, 681 insertions(+), 2137 deletions(-) rename {Assignment_042 => Assignment_041}/img/schnick.png (100%) rename {Assignment_048 => Assignment_047}/kafka.txt (100%) rename {Assignment_052 => Assignment_051}/daten.dat (100%) rename {Assignment_059 => Assignment_058}/data.dat (100%) rename {Assignment_060 => Assignment_059}/kafka.txt (100%) rename {Assignment_063 => Assignment_062}/testdata.dat (100%) create mode 100644 Assignment_082/kafka.txt create mode 100644 Assignment_083/kafka.txt create mode 100644 Assignment_086/kafka.txt delete mode 100644 Assignment_091/readme.md delete mode 100644 Assignment_091/solution/readme.md delete mode 100644 Assignment_092/readme.md delete mode 100644 Assignment_092/solution/readme.md delete mode 100644 Assignment_093/readme.md delete mode 100644 Assignment_093/solution/readme.md delete mode 100644 Assignment_094/readme.md delete mode 100644 Assignment_094/solution/readme.md delete mode 100644 solutions/src/main/java/pr2/collections/iterieren/CoinGenerator.java delete mode 100644 solutions/src/main/java/pr2/collections/iterieren/GameBoard.java delete mode 100644 solutions/src/main/java/pr2/collections/iterieren/GameMain.java delete mode 100644 solutions/src/main/java/pr2/enums/verwenden/GameBoard.java delete mode 100644 solutions/src/main/java/pr2/enums/verwenden/GameMain.java delete mode 100644 solutions/src/main/java/pr2/enums/verwenden/Professor.java delete mode 100644 solutions/src/main/java/pr2/generics/verwenden/GameBoard.java delete mode 100644 solutions/src/main/java/pr2/generics/verwenden/GameMain.java delete mode 100644 solutions/src/main/java/pr2/lambda/static_member/Alien.java delete mode 100644 solutions/src/main/java/pr2/lambda/static_member/GameBoard.java delete mode 100644 solutions/src/main/java/pr2/lambda/static_member/GameMain.java delete mode 100644 sources/src/main/java/pr2/collections/iterieren/CoinGenerator.java delete mode 100644 sources/src/main/java/pr2/collections/iterieren/GameBoard.java delete mode 100644 sources/src/main/java/pr2/collections/iterieren/GameMain.java delete mode 100644 sources/src/main/java/pr2/enums/verwenden/GameBoard.java delete mode 100644 sources/src/main/java/pr2/enums/verwenden/GameMain.java delete mode 100644 sources/src/main/java/pr2/enums/verwenden/Professor.java delete mode 100644 sources/src/main/java/pr2/generics/verwenden/GameBoard.java delete mode 100644 sources/src/main/java/pr2/generics/verwenden/GameMain.java delete mode 100644 sources/src/main/java/pr2/lambda/static_member/Alien.java delete mode 100644 sources/src/main/java/pr2/lambda/static_member/GameBoard.java delete mode 100644 sources/src/main/java/pr2/lambda/static_member/GameMain.java rename sources/src/main/resources/pr2/streams/{reduce => reduce_critics}/games.txt (100%) diff --git a/Assignment_042/img/schnick.png b/Assignment_041/img/schnick.png similarity index 100% rename from Assignment_042/img/schnick.png rename to Assignment_041/img/schnick.png diff --git a/Assignment_041/readme.md b/Assignment_041/readme.md index 1cf70b7..6d0fa55 100644 --- a/Assignment_041/readme.md +++ b/Assignment_041/readme.md @@ -1,23 +1,51 @@ -# Eine vorhandene Enumeration nutzen +# Assignment: Stein, Papier, Schere, Echse, Spock [Musterlösung](solution/) ## Lernziel -Syntax von Enumerationen verstehen und einfache Einsatzzwecke kennenlernen. +Mit Enumerationen arbeiten. ## Aufgabe -Gehen Sie in das Paket [pr2.enums.verwenden](../sources/src/main/java/pr2/enums/verwenden/). +Gehen Sie in das Paket [pr2.enums.schnick](../sources/src/main/java/pr2/enums/schnick). -In dieser Aufgabe sollen Sie mit einer vorhandenen Enumeration experimentieren. Sehen Sie sich hierzu die vorhandenen Klassen an. Insbesondere das Sprite `Professor`. +![Regeln für Schnick-Schnack-Schnuck](img/schnick.png) -Im Konstruktor von `Professor` wird eine Enumeration namens `BoundaryPolicy` genutzt. Schauen Sie sich die JavaDoc der Enumeration an und versuchen Sie zu verstehen, was gemeint ist. +Schreiben Sie ein einfaches Spiel (Klasse `SchnickSchnackSchnuck`), bei dem Sie gegen den Computer Schnick-Schnack-Schnuck spielen (auch Rock, Paper, Scissors genannt) mit folgenden Eigenschaften: -Testen Sie nun die verschiedenen Werte der Enumeration durch und betrachten Sie, wie sich das Sprite anders verhält. + * Das Spiel geht über drei Runden. + * Es fragt den Spieler nach seiner Auswahl (r, p, s). + * Der Computer zieht zufällig eine der drei Möglichkeiten. + * Nach jeder Runde sagt das Spiel, wer welche Möglichkeit gewählt hat und wer die Runde gewonnen hat. + * Ein Sieg bringt einen Punkt, ein Unentschieden 0 Punkte. + * Die Punkte jeder Runde werden addiert. + * Am Ende wird der Gesamtpunktestand ausgegeben. -Überlegen Sie, warum hier eine Enumeration verwendet wurde und nicht etwas Vererbung mit dem Überschreiben von Methoden. +Eine beispielhafte Session mit dem Programm sieht dann wie folgt aus: -## Abgabe +```console +Runde 1: Dein Zug ([r]rock, [p]aper, [s]cissors)? r +Der Computer hat gewonnen - Du: ROCK, Computer: PAPER - [0:1] -Für diese Aufgabe ist keine Abgabe vorgesehen. \ No newline at end of file +Runde 2: Dein Zug ([r]rock, [p]aper, [s]cissors)? p +Unentschieden - Du: PAPER, Computer: PAPER - [0:1] + +Runde 3: Dein Zug ([r]rock, [p]aper, [s]cissors)? s +Du hast gewonnen: Du: SCISSORS, Computer: PAPER - [1:1]### Abgabe +Ergebnis - Du 1 Punkt(e), Computer 1 Punkt(e) +``` + +Repräsentieren Sie die Züge mithilfe einer Enumeration `Move`. Diese soll auch die Tasten beinhalten, welche man für die einzelnen Züge (`r`, `p`, `s`) drücken muss. + + +## 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`. \ No newline at end of file diff --git a/Assignment_041/solution/readme.md b/Assignment_041/solution/readme.md index ceb9257..9c45825 100644 --- a/Assignment_041/solution/readme.md +++ b/Assignment_041/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Eine vorhandene Enumeration nutzen +# Lösung: Stein, Papier, Schere, Echse, Spock Musterlösung: -[pr2.enums.verwenden](../../solutions/src/main/java/pr2/enums/verwenden/) +[pr2.enums.schnick](../../solutions/src/main/java/pr2/enums/schnick). diff --git a/Assignment_042/readme.md b/Assignment_042/readme.md index 6d0fa55..0fd2f31 100644 --- a/Assignment_042/readme.md +++ b/Assignment_042/readme.md @@ -1,42 +1,20 @@ -# Assignment: Stein, Papier, Schere, Echse, Spock +# Ausnahmen testen [Musterlösung](solution/) ## Lernziel -Mit Enumerationen arbeiten. +Bei einer gegebenen Klasse Testfälle mit JUnit schreiben, die auf das Werfen von Ausnahmen testen. ## Aufgabe -Gehen Sie in das Paket [pr2.enums.schnick](../sources/src/main/java/pr2/enums/schnick). +Gehen Sie in das Paket [pr2.exceptions.ausnahmen_testen](../sources/src/main/java/pr2/exceptions/ausnahmen_testen/). -![Regeln für Schnick-Schnack-Schnuck](img/schnick.png) +Sie finden in der Aufgabe eine einfache Implementierung einer [Caesar-Verschlüsselung](https://de.wikipedia.org/wiki/Caesar-Verschlüsselung) in der Klasse `CrypterCaesar`. Außerdem finden Sie noch einen JUnit-Test in dem entsprechenden Paket `test`. -Schreiben Sie ein einfaches Spiel (Klasse `SchnickSchnackSchnuck`), bei dem Sie gegen den Computer Schnick-Schnack-Schnuck spielen (auch Rock, Paper, Scissors genannt) mit folgenden Eigenschaften: +Im JUnit-Test `CaesarTest` fehlen aber noch die Tests für die Ausnahmen. Diese werden geworfen, wenn die übergebenen Schlüssel bzw. die Klar- und Cypher-Texte nicht den Vorgaben entsprechen. Lesen Sie daher sorgfältig die JavaDoc der Klasse `CrypterCaesar` und fügen Sie dann entsprechende Testfälle in `CaesarTest` hinzu, die auf das korrekte Werfen der Ausnahmen testen. - * Das Spiel geht über drei Runden. - * Es fragt den Spieler nach seiner Auswahl (r, p, s). - * Der Computer zieht zufällig eine der drei Möglichkeiten. - * Nach jeder Runde sagt das Spiel, wer welche Möglichkeit gewählt hat und wer die Runde gewonnen hat. - * Ein Sieg bringt einen Punkt, ein Unentschieden 0 Punkte. - * Die Punkte jeder Runde werden addiert. - * Am Ende wird der Gesamtpunktestand ausgegeben. - -Eine beispielhafte Session mit dem Programm sieht dann wie folgt aus: - -```console -Runde 1: Dein Zug ([r]rock, [p]aper, [s]cissors)? r -Der Computer hat gewonnen - Du: ROCK, Computer: PAPER - [0:1] - -Runde 2: Dein Zug ([r]rock, [p]aper, [s]cissors)? p -Unentschieden - Du: PAPER, Computer: PAPER - [0:1] - -Runde 3: Dein Zug ([r]rock, [p]aper, [s]cissors)? s -Du hast gewonnen: Du: SCISSORS, Computer: PAPER - [1:1]### Abgabe -Ergebnis - Du 1 Punkt(e), Computer 1 Punkt(e) -``` - -Repräsentieren Sie die Züge mithilfe einer Enumeration `Move`. Diese soll auch die Tasten beinhalten, welche man für die einzelnen Züge (`r`, `p`, `s`) drücken muss. +Lassen Sie Ihre Unit-Tests laufen und testen Sie, ob die Ausnahmen entsprechend der Vorgaben aus der JavaDoc geworfen werden. ## Abgabe (optional) diff --git a/Assignment_042/solution/readme.md b/Assignment_042/solution/readme.md index 9c45825..a03a8f2 100644 --- a/Assignment_042/solution/readme.md +++ b/Assignment_042/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Stein, Papier, Schere, Echse, Spock +# Lösung: Ausnahmen testen Musterlösung: -[pr2.enums.schnick](../../solutions/src/main/java/pr2/enums/schnick). +[pr2.exceptions.ausnahmen_testen](../../solutions/src/main/java/pr2/exceptions/ausnahmen_testen/) diff --git a/Assignment_043/readme.md b/Assignment_043/readme.md index 0fd2f31..1b4045f 100644 --- a/Assignment_043/readme.md +++ b/Assignment_043/readme.md @@ -1,20 +1,24 @@ -# Ausnahmen testen +# Eigene Ausnahmen schreiben und an entsprechender Stelle werfen [Musterlösung](solution/) ## Lernziel -Bei einer gegebenen Klasse Testfälle mit JUnit schreiben, die auf das Werfen von Ausnahmen testen. +Ausnahmen programmieren und sinnvoll einsetzen. Bedeutung der Schlüsselwörter `throws` und `throw` verstehen. ## Aufgabe -Gehen Sie in das Paket [pr2.exceptions.ausnahmen_testen](../sources/src/main/java/pr2/exceptions/ausnahmen_testen/). +Gehen Sie in das Paket [pr2.exceptions.eigene_ausnahme](../sources/src/main/java/pr2/exceptions/eigene_ausnahme/). -Sie finden in der Aufgabe eine einfache Implementierung einer [Caesar-Verschlüsselung](https://de.wikipedia.org/wiki/Caesar-Verschlüsselung) in der Klasse `CrypterCaesar`. Außerdem finden Sie noch einen JUnit-Test in dem entsprechenden Paket `test`. +In der vorliegenden Aufgabe sollen Sie eine Sicherung (`Fuse`) programmieren. Sicherungen gibt es (in unserer Modellwelt) nur für 16, 25 und 32 Ampére. -Im JUnit-Test `CaesarTest` fehlen aber noch die Tests für die Ausnahmen. Diese werden geworfen, wenn die übergebenen Schlüssel bzw. die Klar- und Cypher-Texte nicht den Vorgaben entsprechen. Lesen Sie daher sorgfältig die JavaDoc der Klasse `CrypterCaesar` und fügen Sie dann entsprechende Testfälle in `CaesarTest` hinzu, die auf das korrekte Werfen der Ausnahmen testen. +Beim Anlegen erfährt die Sicherung über den Konstruktor bei welchem Strom sie auslösen soll. Hierbei soll es nur möglich sein, Sicherungen in den vorhandenen Stärken anzulegen. Bei jedem anderen Wert soll der Konstruktor eine `IllegalCurrentException` werfen. In der Ausnahme soll gespeichert werden, mit welchem (falschen) Wert die Sicherung angelegt werden sollte. Diese Information wird beim Aufruf von `toString()` auf der Ausnahme wieder zurückgegeben. -Lassen Sie Ihre Unit-Tests laufen und testen Sie, ob die Ausnahmen entsprechend der Vorgaben aus der JavaDoc geworfen werden. +Die Sicherung wird benutzt, indem die `use`-Methode mit dem aktuellen Strom aufgerufen wird. Ist dieser größer als der Nennstrom der Sicherung löst diese aus und wirft eine `FuseTrippedException`. In der Ausnahme sind sowohl der Nennstrom als auch der Auslösestrom gespeichert und werden in der `toString`-Methode ausgegeben. + +Beachten Sie die TODO-Kommentare und passen Sie das Programm entsprechend an, damit es die oben beschriebenen Anforderungen erfüllt. + +Kommentieren Sie die Tests ein und lassen Sie diese laufen. Erst wenn alle Tests grün sind, gilt die Aufgabe als bestanden. ## Abgabe (optional) diff --git a/Assignment_043/solution/readme.md b/Assignment_043/solution/readme.md index a03a8f2..7cc2d13 100644 --- a/Assignment_043/solution/readme.md +++ b/Assignment_043/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Ausnahmen testen +# Lösung: Eigene Ausnahmen schreiben und an entsprechender Stelle werfen Musterlösung: -[pr2.exceptions.ausnahmen_testen](../../solutions/src/main/java/pr2/exceptions/ausnahmen_testen/) +[pr2.exceptions.eigene_ausnahme](../../solutions/src/main/java/pr2/exceptions/eigene_ausnahme/) diff --git a/Assignment_044/readme.md b/Assignment_044/readme.md index 1b4045f..31751af 100644 --- a/Assignment_044/readme.md +++ b/Assignment_044/readme.md @@ -1,24 +1,16 @@ -# Eigene Ausnahmen schreiben und an entsprechender Stelle werfen +# Eigene Exception schreiben [Musterlösung](solution/) ## Lernziel -Ausnahmen programmieren und sinnvoll einsetzen. Bedeutung der Schlüsselwörter `throws` und `throw` verstehen. +Eigene Exceptions entwerfen und verwenden. ## Aufgabe -Gehen Sie in das Paket [pr2.exceptions.eigene_ausnahme](../sources/src/main/java/pr2/exceptions/eigene_ausnahme/). +Gehen Sie in das Paket [pr2.exceptions.fakultaet](../sources/src/main/java/pr2/exceptions/fakultaet/). -In der vorliegenden Aufgabe sollen Sie eine Sicherung (`Fuse`) programmieren. Sicherungen gibt es (in unserer Modellwelt) nur für 16, 25 und 32 Ampére. - -Beim Anlegen erfährt die Sicherung über den Konstruktor bei welchem Strom sie auslösen soll. Hierbei soll es nur möglich sein, Sicherungen in den vorhandenen Stärken anzulegen. Bei jedem anderen Wert soll der Konstruktor eine `IllegalCurrentException` werfen. In der Ausnahme soll gespeichert werden, mit welchem (falschen) Wert die Sicherung angelegt werden sollte. Diese Information wird beim Aufruf von `toString()` auf der Ausnahme wieder zurückgegeben. - -Die Sicherung wird benutzt, indem die `use`-Methode mit dem aktuellen Strom aufgerufen wird. Ist dieser größer als der Nennstrom der Sicherung löst diese aus und wirft eine `FuseTrippedException`. In der Ausnahme sind sowohl der Nennstrom als auch der Auslösestrom gespeichert und werden in der `toString`-Methode ausgegeben. - -Beachten Sie die TODO-Kommentare und passen Sie das Programm entsprechend an, damit es die oben beschriebenen Anforderungen erfüllt. - -Kommentieren Sie die Tests ein und lassen Sie diese laufen. Erst wenn alle Tests grün sind, gilt die Aufgabe als bestanden. +Schreiben Sie bitte eine Klasse `Fakultaet`, die die Fakultät einer Zahl zwischen 0 und 20 berechnen kann. Wenn der Wertebereich über- oder unterschritten wird, soll die entsprechende Methode der Klasse eine `FakultaetException` werfen. Schreiben Sie weiterhin einen JUnit-Test, der sowohl die korrekte Funktion, als auch das Werfen der Ausnahme überprüft. ## Abgabe (optional) diff --git a/Assignment_044/solution/readme.md b/Assignment_044/solution/readme.md index 7cc2d13..9c7ad33 100644 --- a/Assignment_044/solution/readme.md +++ b/Assignment_044/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Eigene Ausnahmen schreiben und an entsprechender Stelle werfen +# Lösung: Eigene Exception schreiben Musterlösung: -[pr2.exceptions.eigene_ausnahme](../../solutions/src/main/java/pr2/exceptions/eigene_ausnahme/) +[pr2.exceptions.fakultaet](../../solutions/src/main/java/pr2/exceptions/fakultaet/) diff --git a/Assignment_045/readme.md b/Assignment_045/readme.md index 31751af..43a5a44 100644 --- a/Assignment_045/readme.md +++ b/Assignment_045/readme.md @@ -1,16 +1,21 @@ -# Eigene Exception schreiben +# Handle-or-Declare-Regel anwenden [Musterlösung](solution/) ## Lernziel -Eigene Exceptions entwerfen und verwenden. +In einem vorhandenen Programm die Ausnahmen korrekt weiter deklarieren und an den richtigen Stellen fangen. ## Aufgabe -Gehen Sie in das Paket [pr2.exceptions.fakultaet](../sources/src/main/java/pr2/exceptions/fakultaet/). +Gehen Sie in das Paket [pr2.exceptions.handle_or_declare](../sources/src/main/java/pr2/exceptions/handle_or_declare/). -Schreiben Sie bitte eine Klasse `Fakultaet`, die die Fakultät einer Zahl zwischen 0 und 20 berechnen kann. Wenn der Wertebereich über- oder unterschritten wird, soll die entsprechende Methode der Klasse eine `FakultaetException` werfen. Schreiben Sie weiterhin einen JUnit-Test, der sowohl die korrekte Funktion, als auch das Werfen der Ausnahme überprüft. +Entfernen Sie auskommentierten Zeilen in der Klasse `Buchstabenzaehler`. Das Programm wird nicht korrekt kompilieren, weil die Ausnahmen nicht richtig deklariert und behandelt wurden. + +Korrigieren Sie diesen Fehler und sorgen Sie dafür, dass die Ausnahmen an den Stellen behandelt werden, an denen Sie behandelt werden sollten, d.h. dort wo die Verursachung liegt. Bei der `StatistikException` handelt es sich um eine Inkonsistenz im Programm. Überlegen Sie, wo diese behandelt werden sollte und wann sie auftreten kann. + +Sie müssen die Ausnahmen sinnvoll behandeln. Sie einfach an der `main`-Methode +zu deklarieren ist keine valide Lösung dieser Aufgabe. ## Abgabe (optional) diff --git a/Assignment_045/solution/readme.md b/Assignment_045/solution/readme.md index 9c7ad33..ca9a0e4 100644 --- a/Assignment_045/solution/readme.md +++ b/Assignment_045/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Eigene Exception schreiben +# Lösung: Handle-or-Declare-Regel anwenden Musterlösung: -[pr2.exceptions.fakultaet](../../solutions/src/main/java/pr2/exceptions/fakultaet/) +[pr2.exceptions.handle_or_declare](../../solutions/src/main/java/pr2/exceptions/handle_or_declare/) diff --git a/Assignment_046/readme.md b/Assignment_046/readme.md index 43a5a44..ddd3f7b 100644 --- a/Assignment_046/readme.md +++ b/Assignment_046/readme.md @@ -1,21 +1,20 @@ -# Handle-or-Declare-Regel anwenden +# Ausnahmen mit `try` und `catch` behandeln. [Musterlösung](solution/) ## Lernziel -In einem vorhandenen Programm die Ausnahmen korrekt weiter deklarieren und an den richtigen Stellen fangen. +Vorhandene Ausnahmen mit `try` und `catch` abfangen und behandeln. ## Aufgabe -Gehen Sie in das Paket [pr2.exceptions.handle_or_declare](../sources/src/main/java/pr2/exceptions/handle_or_declare/). +Gehen Sie in das Paket [pr2.exceptions.try_catch](../sources/src/main/java/pr2/exceptions/try_catch/). -Entfernen Sie auskommentierten Zeilen in der Klasse `Buchstabenzaehler`. Das Programm wird nicht korrekt kompilieren, weil die Ausnahmen nicht richtig deklariert und behandelt wurden. +Betrachten Sie das sehr einfache Zahlenraten-Spiel. Lassen Sie es laufen und spielen Sie ein paar Runden. Versuchen Sie das Programm durch falsche Eingaben zum Absturz zu bringen. -Korrigieren Sie diesen Fehler und sorgen Sie dafür, dass die Ausnahmen an den Stellen behandelt werden, an denen Sie behandelt werden sollten, d.h. dort wo die Verursachung liegt. Bei der `StatistikException` handelt es sich um eine Inkonsistenz im Programm. Überlegen Sie, wo diese behandelt werden sollte und wann sie auftreten kann. +Im Augenblick werden die Ausnahmen in der `main()`-Methode weiter deklariert, was schlechter Stil ist und zu bei Falscheingaben zu Programmabstürzen führt. Ändern Sie das Programm stattdessen so ab, dass die Ausnahmen korrekt behandelt werden. Entfernen Sie danach die `throws`-Deklaration aus dem Kopf der `main()`-Methode. -Sie müssen die Ausnahmen sinnvoll behandeln. Sie einfach an der `main`-Methode -zu deklarieren ist keine valide Lösung dieser Aufgabe. +Lassen Sie das Programm erneut laufen und testen Sie, ob es jetzt nach Falscheingaben immer noch abstürzt. ## Abgabe (optional) diff --git a/Assignment_046/solution/readme.md b/Assignment_046/solution/readme.md index ca9a0e4..f28d42d 100644 --- a/Assignment_046/solution/readme.md +++ b/Assignment_046/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Handle-or-Declare-Regel anwenden +# Lösung: Ausnahmen mit `try` und `catch` behandeln. Musterlösung: -[pr2.exceptions.handle_or_declare](../../solutions/src/main/java/pr2/exceptions/handle_or_declare/) +[pr2.exceptions.try_catch](../../solutions/src/main/java/pr2/exceptions/try_catch/) diff --git a/Assignment_048/kafka.txt b/Assignment_047/kafka.txt similarity index 100% rename from Assignment_048/kafka.txt rename to Assignment_047/kafka.txt diff --git a/Assignment_047/readme.md b/Assignment_047/readme.md index ddd3f7b..9577949 100644 --- a/Assignment_047/readme.md +++ b/Assignment_047/readme.md @@ -1,20 +1,29 @@ -# Ausnahmen mit `try` und `catch` behandeln. +# `BufferedReader` zum zeilenweisen Lesen einsetzen [Musterlösung](solution/) ## Lernziel -Vorhandene Ausnahmen mit `try` und `catch` abfangen und behandeln. +Daten Zeilenweise mit einem `BufferedReader` verwenden und dabei das Decorator Pattern einsetzen. ## Aufgabe -Gehen Sie in das Paket [pr2.exceptions.try_catch](../sources/src/main/java/pr2/exceptions/try_catch/). +Gehen Sie in das Paket [pr2.io.buffered_reader](../sources/src/main/java/pr2/io/buffered_reader/). -Betrachten Sie das sehr einfache Zahlenraten-Spiel. Lassen Sie es laufen und spielen Sie ein paar Runden. Versuchen Sie das Programm durch falsche Eingaben zum Absturz zu bringen. +Lesen Sie die Datei [kafka.txt](../sources/src/main/resources/pr2/io/buffered_reader/kafka.txt) zeilenweise ein und geben Sie die Zeilen mit einer fortlaufenden Zeilennummer wieder aus. Verwenden Sie hierzu einen `BufferedReader`. -Im Augenblick werden die Ausnahmen in der `main()`-Methode weiter deklariert, was schlechter Stil ist und zu bei Falscheingaben zu Programmabstürzen führt. Ändern Sie das Programm stattdessen so ab, dass die Ausnahmen korrekt behandelt werden. Entfernen Sie danach die `throws`-Deklaration aus dem Kopf der `main()`-Methode. +Eine beispielhafte Ausgabe sieht wie folgt aus: -Lassen Sie das Programm erneut laufen und testen Sie, ob es jetzt nach Falscheingaben immer noch abstürzt. +```console +1: Verhaftung - Gespräch mit Frau Grubach - Dann Fräulein Bürstner +2: +3: Jemand mußte Josef K. verleumdet haben, denn ohne daß er etwas Böses +4: getan hätte, wurde er eines Morgens verhaftet. Die Köchin der Frau +5: Grubach, seiner Zimmervermieterin, die ihm jeden Tag gegen acht Uhr früh +6: das Frühstück brachte, kam diesmal nicht. Das war noch niemals +``` + +Lassen Sie das Programm laufen und überprüfen Sie, ob die Ausgabe korrekt ist. Die Beispieldatei hat 232 Zeilen. ## Abgabe (optional) diff --git a/Assignment_047/solution/readme.md b/Assignment_047/solution/readme.md index f28d42d..1bca802 100644 --- a/Assignment_047/solution/readme.md +++ b/Assignment_047/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Ausnahmen mit `try` und `catch` behandeln. +# Lösung: `BufferedReader` zum zeilenweisen Lesen einsetzen Musterlösung: -[pr2.exceptions.try_catch](../../solutions/src/main/java/pr2/exceptions/try_catch/) +[pr2.io.buffered_reader](../../solutions/src/main/java/pr2/io/buffered_reader/) diff --git a/Assignment_048/readme.md b/Assignment_048/readme.md index 9577949..e2cd1bc 100644 --- a/Assignment_048/readme.md +++ b/Assignment_048/readme.md @@ -1,29 +1,28 @@ -# `BufferedReader` zum zeilenweisen Lesen einsetzen +# DataOutputStream [Musterlösung](solution/) ## Lernziel -Daten Zeilenweise mit einem `BufferedReader` verwenden und dabei das Decorator Pattern einsetzen. +Daten mit einem `DataOutputStreams` manuell serialisieren. ## Aufgabe -Gehen Sie in das Paket [pr2.io.buffered_reader](../sources/src/main/java/pr2/io/buffered_reader/). +Gehen Sie in das Paket [pr2.io.datainputoutput_1](../sources/src/main/java/pr2/io/datainputoutput_1/). -Lesen Sie die Datei [kafka.txt](../sources/src/main/resources/pr2/io/buffered_reader/kafka.txt) zeilenweise ein und geben Sie die Zeilen mit einer fortlaufenden Zeilennummer wieder aus. Verwenden Sie hierzu einen `BufferedReader`. +Schreiben Sie eine Klasse `DateWriter`, die ein Datum in der Form yyyy-MM-dd (z.B. 1997-08-29) von der Konsole annimmt und als `long`-Wert mithilfe eines `DataOutputStreams` in eine Datei schreibt. -Eine beispielhafte Ausgabe sieht wie folgt aus: +Schreiben Sie eine Klasse `DateReader`, die den `long`-Wert aus der Datei ausliest und wieder in das ursprüngliche Format bringt und auf der Konsole ausgibt. + +**Hinweis:** Zur Konvertierung eines Strings in ein Datum und umgekehrt, können Sie die Klasse `SimpleDateFormat` verwenden. Ein `Date`-Objekt lässt sich leicht über die Methode `getTime` in einen `long`-Wert umwandeln. Denken Sie an eine korrekte Behandlung von möglichen Fehlern. ```console -1: Verhaftung - Gespräch mit Frau Grubach - Dann Fräulein Bürstner -2: -3: Jemand mußte Josef K. verleumdet haben, denn ohne daß er etwas Böses -4: getan hätte, wurde er eines Morgens verhaftet. Die Köchin der Frau -5: Grubach, seiner Zimmervermieterin, die ihm jeden Tag gegen acht Uhr früh -6: das Frühstück brachte, kam diesmal nicht. Das war noch niemals +> java DateWriter 1997-08-29 +> java DateReader +Das Datum war: 1997-08-29 ``` -Lassen Sie das Programm laufen und überprüfen Sie, ob die Ausgabe korrekt ist. Die Beispieldatei hat 232 Zeilen. +**Zusatzfrage:** Welche besondere Bedeutung hat das hier als Beispiel verwendete Datum? ## Abgabe (optional) diff --git a/Assignment_048/solution/readme.md b/Assignment_048/solution/readme.md index 1bca802..07be1ad 100644 --- a/Assignment_048/solution/readme.md +++ b/Assignment_048/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: `BufferedReader` zum zeilenweisen Lesen einsetzen +# Lösung: DataOutputStream Musterlösung: -[pr2.io.buffered_reader](../../solutions/src/main/java/pr2/io/buffered_reader/) +[pr2.io.datainputoutput_1](../../solutions/src/main/java/pr2/io/datainputoutput_1/) diff --git a/Assignment_049/readme.md b/Assignment_049/readme.md index e2cd1bc..c3462ab 100644 --- a/Assignment_049/readme.md +++ b/Assignment_049/readme.md @@ -1,28 +1,18 @@ -# DataOutputStream +# DataOutputStream durch Serialisierung ersetzen [Musterlösung](solution/) ## Lernziel -Daten mit einem `DataOutputStreams` manuell serialisieren. +Daten mit einem `ObjectOutputStreams` serialisieren. ## Aufgabe -Gehen Sie in das Paket [pr2.io.datainputoutput_1](../sources/src/main/java/pr2/io/datainputoutput_1/). +Gehen Sie in das Paket [pr2.io.datainputoutput_2](../sources/src/main/java/pr2/io/datainputoutput_2/). -Schreiben Sie eine Klasse `DateWriter`, die ein Datum in der Form yyyy-MM-dd (z.B. 1997-08-29) von der Konsole annimmt und als `long`-Wert mithilfe eines `DataOutputStreams` in eine Datei schreibt. +Verändern Sie die beiden Klassen aus der vorhergehenden Aufgabe so, dass sie jetzt anstatt eines `DataOutputStreams` bzw. eines `DataInputStreams` Serialisierung verwenden. -Schreiben Sie eine Klasse `DateReader`, die den `long`-Wert aus der Datei ausliest und wieder in das ursprüngliche Format bringt und auf der Konsole ausgibt. - -**Hinweis:** Zur Konvertierung eines Strings in ein Datum und umgekehrt, können Sie die Klasse `SimpleDateFormat` verwenden. Ein `Date`-Objekt lässt sich leicht über die Methode `getTime` in einen `long`-Wert umwandeln. Denken Sie an eine korrekte Behandlung von möglichen Fehlern. - -```console -> java DateWriter 1997-08-29 -> java DateReader -Das Datum war: 1997-08-29 -``` - -**Zusatzfrage:** Welche besondere Bedeutung hat das hier als Beispiel verwendete Datum? +Vergleichen Sie bitte die Dateien, die bei diesem und der anderen Lösung entstanden sind. Was fällt ihnen auf? ## Abgabe (optional) diff --git a/Assignment_049/solution/readme.md b/Assignment_049/solution/readme.md index 07be1ad..be1a62c 100644 --- a/Assignment_049/solution/readme.md +++ b/Assignment_049/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: DataOutputStream +# Lösung: DataOutputStream durch Serialisierung ersetzen Musterlösung: -[pr2.io.datainputoutput_1](../../solutions/src/main/java/pr2/io/datainputoutput_1/) +[pr2.io.datainputoutput_2](../../solutions/src/main/java/pr2/io/datainputoutput_2/) diff --git a/Assignment_050/readme.md b/Assignment_050/readme.md index c3462ab..4494895 100644 --- a/Assignment_050/readme.md +++ b/Assignment_050/readme.md @@ -1,18 +1,41 @@ -# DataOutputStream durch Serialisierung ersetzen +# Daten mit `DataOutputStream` und `DataInputStream` verarbeiten [Musterlösung](solution/) ## Lernziel -Daten mit einem `ObjectOutputStreams` serialisieren. +Ein eigenes Format für die Daten einer Klasse definieren und diese Dann in einer Datei speichern und aus dieser wieder laden. ## Aufgabe -Gehen Sie in das Paket [pr2.io.datainputoutput_2](../sources/src/main/java/pr2/io/datainputoutput_2/). +Gehen Sie in das Paket [pr2.io.data_output](../sources/src/main/java/pr2/io/data_output/). -Verändern Sie die beiden Klassen aus der vorhergehenden Aufgabe so, dass sie jetzt anstatt eines `DataOutputStreams` bzw. eines `DataInputStreams` Serialisierung verwenden. +In dieser Aufgabe finden Sie bereits eine fertig implementierte Klasse `Board` vor, die ein Schachbrett repräsentiert. Allerdings wird dieses nicht für Schach benutzt, sondern für ein Spiel, bei dem man nur schwarze und weiße Steine auf das Brett stellen kann (z.B. Dame). Die Farbe der Steine wird durch die Enumeration `Color` dargestellt. -Vergleichen Sie bitte die Dateien, die bei diesem und der anderen Lösung entstanden sind. Was fällt ihnen auf? +Was bei dem Schachbrett allerdings noch fehlt, ist eine Möglichkeit den Spielstand zu speichern und später wieder einzulesen. + +Schauen Sie sich die Klassen `Board` und `Color` genau an und versuchen Sie diese zu verstehen. Sie können auch testweise ein Brett anlegen und mit Daten befüllen. (Wie dies geht, sehen Sie im JUnit-Test). Die `toString()`-Methode liefert eine anschauliche Darstellung des Spielfeldes. + +Implementieren Sie nun die Methoden `writeToFile` und `loadFromFile` unter Zuhilfenahme von `DateOutputStream` und `DataInputStream`. Hierzu müssen Sie noch das Datenformat für die Speicherung festlegen. Dieses ist wie folgt definiert: + + 1. Als erstes der String "Schachbrett" im UTF8-Format, um das Datenformat zu kennzeichnen. + 2. Die Koordinaten der ersten Figur im Format x-Pos, y-Pos (beide als `byte`) und Farbe entsprechend `Color.ordinal()` (als `int`) + 3. Wiederholung von Schritt 2. bis alle Figuren gespeichert sind. + 4. Werte `0xff`, `0xff`, `-1`, um das Dateiende zu kennzeichnen + +Lassen Sie den JUnit-Test laufen, um zu sehen, ob die Daten korrekt verarbeitet werden. + + +## 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`. ## Abgabe (optional) diff --git a/Assignment_050/solution/readme.md b/Assignment_050/solution/readme.md index be1a62c..a168ce3 100644 --- a/Assignment_050/solution/readme.md +++ b/Assignment_050/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: DataOutputStream durch Serialisierung ersetzen +# Lösung: Daten mit `DataOutputStream` und `DataInputStream` verarbeiten Musterlösung: -[pr2.io.datainputoutput_2](../../solutions/src/main/java/pr2/io/datainputoutput_2/) +[pr2.io.data_output](../../solutions/src/main/java/pr2/io/data_output/) diff --git a/Assignment_052/daten.dat b/Assignment_051/daten.dat similarity index 100% rename from Assignment_052/daten.dat rename to Assignment_051/daten.dat diff --git a/Assignment_051/readme.md b/Assignment_051/readme.md index 4494895..97e8ecc 100644 --- a/Assignment_051/readme.md +++ b/Assignment_051/readme.md @@ -1,41 +1,24 @@ -# Daten mit `DataOutputStream` und `DataInputStream` verarbeiten +# Daten mit einem `InputStream` lesen [Musterlösung](solution/) ## Lernziel -Ein eigenes Format für die Daten einer Klasse definieren und diese Dann in einer Datei speichern und aus dieser wieder laden. +Einen `InputStream` benutzen, um Daten aus einer Datei zu lesen. ## Aufgabe -Gehen Sie in das Paket [pr2.io.data_output](../sources/src/main/java/pr2/io/data_output/). +Gehen Sie in das Paket [pr2.io.datei_lesen](../sources/src/main/java/pr2/io/datei_lesen/). -In dieser Aufgabe finden Sie bereits eine fertig implementierte Klasse `Board` vor, die ein Schachbrett repräsentiert. Allerdings wird dieses nicht für Schach benutzt, sondern für ein Spiel, bei dem man nur schwarze und weiße Steine auf das Brett stellen kann (z.B. Dame). Die Farbe der Steine wird durch die Enumeration `Color` dargestellt. +Lesen Sie die Daten aus der Datei [daten.dat](../sources/src/main/resources/pr2/io/datei_lesen/daten.dat) byteweise und geben Sie den Inhalt auf der Konsole aus. Für die Ausgabe verwenden Sie bitte die Hexadezimale Darstellung, also z.B. `0x0a` für den Wert 11. -Was bei dem Schachbrett allerdings noch fehlt, ist eine Möglichkeit den Spielstand zu speichern und später wieder einzulesen. +Lassen Sie das Programm laufen und betrachten Sie die Ausgabe. Wenn Sie alles korrekt implementiert haben, sollten Sie den Text -Schauen Sie sich die Klassen `Board` und `Color` genau an und versuchen Sie diese zu verstehen. Sie können auch testweise ein Brett anlegen und mit Daten befüllen. (Wie dies geht, sehen Sie im JUnit-Test). Die `toString()`-Methode liefert eine anschauliche Darstellung des Spielfeldes. + 0xca 0xff 0xfe 0xba 0xbe 0x0 0xde 0xad 0xbe 0xef -Implementieren Sie nun die Methoden `writeToFile` und `loadFromFile` unter Zuhilfenahme von `DateOutputStream` und `DataInputStream`. Hierzu müssen Sie noch das Datenformat für die Speicherung festlegen. Dieses ist wie folgt definiert: +sehen. - 1. Als erstes der String "Schachbrett" im UTF8-Format, um das Datenformat zu kennzeichnen. - 2. Die Koordinaten der ersten Figur im Format x-Pos, y-Pos (beide als `byte`) und Farbe entsprechend `Color.ordinal()` (als `int`) - 3. Wiederholung von Schritt 2. bis alle Figuren gespeichert sind. - 4. Werte `0xff`, `0xff`, `-1`, um das Dateiende zu kennzeichnen - -Lassen Sie den JUnit-Test laufen, um zu sehen, ob die Daten korrekt verarbeitet werden. - - -## 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`. +Denken Sie auch an eine Fehlerbehandlung für eventuelle Ausnahmen im Zusammenhang mit der Datei. ## Abgabe (optional) diff --git a/Assignment_051/solution/readme.md b/Assignment_051/solution/readme.md index a168ce3..b3a3f87 100644 --- a/Assignment_051/solution/readme.md +++ b/Assignment_051/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Daten mit `DataOutputStream` und `DataInputStream` verarbeiten +# Lösung: Daten mit einem `InputStream` lesen Musterlösung: -[pr2.io.data_output](../../solutions/src/main/java/pr2/io/data_output/) +[pr2.io.datei_lesen](../../solutions/src/main/java/pr2/io/datei_lesen/) diff --git a/Assignment_052/readme.md b/Assignment_052/readme.md index 97e8ecc..3a203b0 100644 --- a/Assignment_052/readme.md +++ b/Assignment_052/readme.md @@ -1,24 +1,26 @@ -# Daten mit einem `InputStream` lesen +# Daten mit einem `OutputStream` schreiben [Musterlösung](solution/) ## Lernziel -Einen `InputStream` benutzen, um Daten aus einer Datei zu lesen. +Einen `OutputStream` verwenden, um Daten zu schreiben. ## Aufgabe -Gehen Sie in das Paket [pr2.io.datei_lesen](../sources/src/main/java/pr2/io/datei_lesen/). +Gehen Sie in das Paket [pr2.io.datei_schreiben](../sources/src/main/java/pr2/io/datei_schreiben/). -Lesen Sie die Daten aus der Datei [daten.dat](../sources/src/main/resources/pr2/io/datei_lesen/daten.dat) byteweise und geben Sie den Inhalt auf der Konsole aus. Für die Ausgabe verwenden Sie bitte die Hexadezimale Darstellung, also z.B. `0x0a` für den Wert 11. +In dieser Aufgabe sollen Sie eine Reihe von Bytes in eine Datei schreiben. Ein JUnit-Test wird überprüfen, ob Sie dies richtig getan haben. -Lassen Sie das Programm laufen und betrachten Sie die Ausgabe. Wenn Sie alles korrekt implementiert haben, sollten Sie den Text +Öffnen Sie einen passenden `OutputStream`, um in die Datei `output/daten.dat` zu schreiben (verwenden Sie die Konstante `FILE` für den Dateinamen). Schreiben Sie nun die Byte-Folge - 0xca 0xff 0xfe 0xba 0xbe 0x0 0xde 0xad 0xbe 0xef +```console +0xca 0xff 0xfe 0xba 0xbe 0x0 0xde 0xad 0xbe 0xef +``` -sehen. +hinein und schließen Sie die Datei wieder. -Denken Sie auch an eine Fehlerbehandlung für eventuelle Ausnahmen im Zusammenhang mit der Datei. +Führen Sie den JUnit-Test aus, der überprüft, ob alle Daten korrekt in die Datei geschrieben wurden. ## Abgabe (optional) diff --git a/Assignment_052/solution/readme.md b/Assignment_052/solution/readme.md index b3a3f87..0d7f08a 100644 --- a/Assignment_052/solution/readme.md +++ b/Assignment_052/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Daten mit einem `InputStream` lesen +# Lösung: Daten mit einem `OutputStream` schreiben Musterlösung: -[pr2.io.datei_lesen](../../solutions/src/main/java/pr2/io/datei_lesen/) +[pr2.io.datei_schreiben](../../solutions/src/main/java/pr2/io/datei_schreiben/) diff --git a/Assignment_053/readme.md b/Assignment_053/readme.md index 3a203b0..197a28b 100644 --- a/Assignment_053/readme.md +++ b/Assignment_053/readme.md @@ -1,26 +1,37 @@ -# Daten mit einem `OutputStream` schreiben +# Filesystem-Abstraktion mit `File` [Musterlösung](solution/) ## Lernziel -Einen `OutputStream` verwenden, um Daten zu schreiben. +Die Klasse `Path` einsetzen, um plattformunabhängig Operationen auf dem Dateisystem durchzuführen. ## Aufgabe -Gehen Sie in das Paket [pr2.io.datei_schreiben](../sources/src/main/java/pr2/io/datei_schreiben/). +Gehen Sie in das Paket [pr2.io.file](../sources/src/main/java/pr2/io/file/). -In dieser Aufgabe sollen Sie eine Reihe von Bytes in eine Datei schreiben. Ein JUnit-Test wird überprüfen, ob Sie dies richtig getan haben. +Benutzen Sie die Klasse `Path`, um die Festplatte Ihres Computers, ausgehend von dem als `root` bezeichneten Verzeichnis `../..` zu durchsuchen und die Größe der Verzeichnisse zu berechnen. -Öffnen Sie einen passenden `OutputStream`, um in die Datei `output/daten.dat` zu schreiben (verwenden Sie die Konstante `FILE` für den Dateinamen). Schreiben Sie nun die Byte-Folge +Sie können die Größe eines Verzeichnisses nur indirekt bestimme, indem Sie die Größe aller Dateien in dem Verzeichnis addieren. Das Verzeichnis direkt kann man _nicht_ mit `size()` nach seiner Größe fragen, wohl aber normale Dateien. Deswegen müssen Sie in Ihrem Programm immer sauber unterscheiden, ob ein Verzeichnis vorliegt (das sie rekursiv durchlaufen müssen) oder eine normale Datei (deren Größe Sie abfragen). + +Geben Sie die Verzeichnisse mit Ihrer Größe aus. Am Ende des Programms geben Sie noch die Gesamtgröße aller Unterverzeichnisse aus. Eine beispielhafte sähe wie folgt aus: ```console -0xca 0xff 0xfe 0xba 0xbe 0x0 0xde 0xad 0xbe 0xef +Untersuche: /home/thomas/eclipse-workspace + +465 Byte - /home/thomas/eclipse-workspace/.recommenders/snipmatch/repositories +1,4 kByte - /home/thomas/eclipse-workspace/.recommenders/snipmatch +4,6 MByte - /home/thomas/eclipse-workspace/.recommenders +57,5 MByte - /home/thomas/eclipse-workspace +103 Byte - /home/thomas/lib/.settings +5,8 MByte - /home/thomas/lib + +Gesamtgröße: 80,4 MByte ``` -hinein und schließen Sie die Datei wieder. +Lassen Sie Ihr Programm laufen und überprüfen Sie, ob die Ausgaben plausibel sind. Vergleichen Sie das Ergebnis mit den Angaben des Windows-Explorers, Mac-Finders oder Linux-Dateimanagers. -Führen Sie den JUnit-Test aus, der überprüft, ob alle Daten korrekt in die Datei geschrieben wurden. +Unter Linux und MacOS müssen Sie darauf achten, dass Sie symbolischen Links in Ihrem Programm nicht folgen, sonst zählen Sie möglicherweise zu viel. ## Abgabe (optional) diff --git a/Assignment_053/solution/readme.md b/Assignment_053/solution/readme.md index 0d7f08a..0256bc8 100644 --- a/Assignment_053/solution/readme.md +++ b/Assignment_053/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Daten mit einem `OutputStream` schreiben +# Lösung: Filesystem-Abstraktion mit `File` Musterlösung: -[pr2.io.datei_schreiben](../../solutions/src/main/java/pr2/io/datei_schreiben/) +[pr2.io.file](../../solutions/src/main/java/pr2/io/file/) diff --git a/Assignment_054/readme.md b/Assignment_054/readme.md index 197a28b..3647021 100644 --- a/Assignment_054/readme.md +++ b/Assignment_054/readme.md @@ -1,38 +1,33 @@ -# Filesystem-Abstraktion mit `File` +# Fileattribute lesen [Musterlösung](solution/) ## Lernziel -Die Klasse `Path` einsetzen, um plattformunabhängig Operationen auf dem Dateisystem durchzuführen. +Methoden der Klassen `Path` und `Files` nutzen und verstehen. ## Aufgabe -Gehen Sie in das Paket [pr2.io.file](../sources/src/main/java/pr2/io/file/). +Gehen Sie in das Paket [pr2.io.filetest](../sources/src/main/java/pr2/io/filetest/). -Benutzen Sie die Klasse `Path`, um die Festplatte Ihres Computers, ausgehend von dem als `root` bezeichneten Verzeichnis `../..` zu durchsuchen und die Größe der Verzeichnisse zu berechnen. - -Sie können die Größe eines Verzeichnisses nur indirekt bestimme, indem Sie die Größe aller Dateien in dem Verzeichnis addieren. Das Verzeichnis direkt kann man _nicht_ mit `size()` nach seiner Größe fragen, wohl aber normale Dateien. Deswegen müssen Sie in Ihrem Programm immer sauber unterscheiden, ob ein Verzeichnis vorliegt (das sie rekursiv durchlaufen müssen) oder eine normale Datei (deren Größe Sie abfragen). - -Geben Sie die Verzeichnisse mit Ihrer Größe aus. Am Ende des Programms geben Sie noch die Gesamtgröße aller Unterverzeichnisse aus. Eine beispielhafte sähe wie folgt aus: +Schreiben Sie eine Klasse `FileInfo`, der man auf der Konsole einen Datei- oder Verzeichnisnamen übergeben kann. Sie soll dann einige grundlegende Informationen über die Datei ausgeben (siehe Beispiel). ```console -Untersuche: /home/thomas/eclipse-workspace +> java FileTest /Users/thomas/Documents/../Documents/ +/Users/thomas/Documents existiert +/Users/thomas/Documents ist 408 Bytes groß +/Users/thomas/Documents ist ein Verzeichnis +/Users/thomas/Documents darf gelesen werden +/Users/thomas/Documents darf geschrieben werden -465 Byte - /home/thomas/eclipse-workspace/.recommenders/snipmatch/repositories -1,4 kByte - /home/thomas/eclipse-workspace/.recommenders/snipmatch -4,6 MByte - /home/thomas/eclipse-workspace/.recommenders -57,5 MByte - /home/thomas/eclipse-workspace -103 Byte - /home/thomas/lib/.settings -5,8 MByte - /home/thomas/lib - -Gesamtgröße: 80,4 MByte +> java FileTest /Users/thomas/Documents/../Documents/Uebungsklausur.pages +/Users/thomas/Documents/Uebungsklausur.pages existiert +/Users/thomas/Documents/Uebungsklausur.pages ist 258920 Bytes groß +/Users/thomas/Documents/Uebungsklausur.pages ist ein normale Datei +/Users/thomas/Documents/Uebungsklausur.pages darf gelesen werden +/Users/thomas/Documents/Uebungsklausur.pages darf geschrieben werden ``` -Lassen Sie Ihr Programm laufen und überprüfen Sie, ob die Ausgaben plausibel sind. Vergleichen Sie das Ergebnis mit den Angaben des Windows-Explorers, Mac-Finders oder Linux-Dateimanagers. - -Unter Linux und MacOS müssen Sie darauf achten, dass Sie symbolischen Links in Ihrem Programm nicht folgen, sonst zählen Sie möglicherweise zu viel. - ## Abgabe (optional) diff --git a/Assignment_054/solution/readme.md b/Assignment_054/solution/readme.md index 0256bc8..d3f3fce 100644 --- a/Assignment_054/solution/readme.md +++ b/Assignment_054/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Filesystem-Abstraktion mit `File` +# Lösung: Fileattribute lesen Musterlösung: -[pr2.io.file](../../solutions/src/main/java/pr2/io/file/) +[pr2.io.filetest](../../solutions/src/main/java/pr2/io/filetest/) diff --git a/Assignment_055/readme.md b/Assignment_055/readme.md index 3647021..dc2236b 100644 --- a/Assignment_055/readme.md +++ b/Assignment_055/readme.md @@ -1,32 +1,18 @@ -# Fileattribute lesen +# `FilterReader` [Musterlösung](solution/) ## Lernziel -Methoden der Klassen `Path` und `Files` nutzen und verstehen. +Einen eigenen Filter in Form eines `FilterReaders` programmieren und hiermit in den Datenstrom eingreifen. ## Aufgabe -Gehen Sie in das Paket [pr2.io.filetest](../sources/src/main/java/pr2/io/filetest/). +Gehen Sie in das Paket [pr2.io.filter](../sources/src/main/java/pr2/io/filter/). -Schreiben Sie eine Klasse `FileInfo`, der man auf der Konsole einen Datei- oder Verzeichnisnamen übergeben kann. Sie soll dann einige grundlegende Informationen über die Datei ausgeben (siehe Beispiel). +Vervollständigen Sie die Klasse `UCaseReader` so, dass Sie als Filter (`FilterReader`) verwendet werden kann. Die Aufgabe dieses Filters besteht darin, alle gelesenen Zeichen in Großbuchstaben umzuwandeln. -```console -> java FileTest /Users/thomas/Documents/../Documents/ -/Users/thomas/Documents existiert -/Users/thomas/Documents ist 408 Bytes groß -/Users/thomas/Documents ist ein Verzeichnis -/Users/thomas/Documents darf gelesen werden -/Users/thomas/Documents darf geschrieben werden - -> java FileTest /Users/thomas/Documents/../Documents/Uebungsklausur.pages -/Users/thomas/Documents/Uebungsklausur.pages existiert -/Users/thomas/Documents/Uebungsklausur.pages ist 258920 Bytes groß -/Users/thomas/Documents/Uebungsklausur.pages ist ein normale Datei -/Users/thomas/Documents/Uebungsklausur.pages darf gelesen werden -/Users/thomas/Documents/Uebungsklausur.pages darf geschrieben werden -``` +Testen Sie, ob Ihre Implementierung korrekt ist, indem Sie die JUnit-Tests ausführen. ## Abgabe (optional) diff --git a/Assignment_055/solution/readme.md b/Assignment_055/solution/readme.md index d3f3fce..8f59e95 100644 --- a/Assignment_055/solution/readme.md +++ b/Assignment_055/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Fileattribute lesen +# Lösung: `FilterReader` Musterlösung: -[pr2.io.filetest](../../solutions/src/main/java/pr2/io/filetest/) +[pr2.io.filter](../../solutions/src/main/java/pr2/io/filter/) diff --git a/Assignment_056/readme.md b/Assignment_056/readme.md index dc2236b..ef04af0 100644 --- a/Assignment_056/readme.md +++ b/Assignment_056/readme.md @@ -1,18 +1,20 @@ -# `FilterReader` +# Konsolen Input/Output [Musterlösung](solution/) ## Lernziel -Einen eigenen Filter in Form eines `FilterReaders` programmieren und hiermit in den Datenstrom eingreifen. +Daten von der Konsole lesen und über eine Ausgabeumlenkung in eine Datei umlenken. `PrintStream` und `InputStreamReader` einsetzen. ## Aufgabe -Gehen Sie in das Paket [pr2.io.filter](../sources/src/main/java/pr2/io/filter/). +Gehen Sie in das Paket [pr2.io.konsole](../sources/src/main/java/pr2/io/konsole/). -Vervollständigen Sie die Klasse `UCaseReader` so, dass Sie als Filter (`FilterReader`) verwendet werden kann. Die Aufgabe dieses Filters besteht darin, alle gelesenen Zeichen in Großbuchstaben umzuwandeln. +Lesen Sie zeilenweise mithilfe eines `BufferedReaders` von der Konsole Zeichen ein. Geben Sie diese wieder auf `System.out` aus und zeigen Sie die aktuelle Zeilennummer auf `System.err` an. -Testen Sie, ob Ihre Implementierung korrekt ist, indem Sie die JUnit-Tests ausführen. +Testen Sie das Programm. + +Lenken Sie nun die Ausgabe von `System.out` in die Datei `output/console.log` um (siehe Konstante `LOGFILE`). Lassen Sie das Programm erneut laufen und betrachten Sie danach die Datei mit den umgeleiteten Daten. ## Abgabe (optional) diff --git a/Assignment_056/solution/readme.md b/Assignment_056/solution/readme.md index 8f59e95..3ed3b1f 100644 --- a/Assignment_056/solution/readme.md +++ b/Assignment_056/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: `FilterReader` +# Lösung: Konsolen Input/Output Musterlösung: -[pr2.io.filter](../../solutions/src/main/java/pr2/io/filter/) +[pr2.io.konsole](../../solutions/src/main/java/pr2/io/konsole/) diff --git a/Assignment_057/readme.md b/Assignment_057/readme.md index ef04af0..9c367d4 100644 --- a/Assignment_057/readme.md +++ b/Assignment_057/readme.md @@ -1,20 +1,21 @@ -# Konsolen Input/Output +# Zeilen einer Textdatei zählen [Musterlösung](solution/) ## Lernziel -Daten von der Konsole lesen und über eine Ausgabeumlenkung in eine Datei umlenken. `PrintStream` und `InputStreamReader` einsetzen. +Dateien zeilenweise lesen und verarbeiten. ## Aufgabe -Gehen Sie in das Paket [pr2.io.konsole](../sources/src/main/java/pr2/io/konsole/). +Gehen Sie in das Paket [pr2.io.linecounter](../sources/src/main/java/pr2/io/linecounter/). -Lesen Sie zeilenweise mithilfe eines `BufferedReaders` von der Konsole Zeichen ein. Geben Sie diese wieder auf `System.out` aus und zeigen Sie die aktuelle Zeilennummer auf `System.err` an. +Schreiben Sie eine Klasse `LineCounter`, die den Namen einer Textdatei von der Kommandozeile entgegennimmt und dann die Anzahl der Zeilen in der Datei ausgibt. -Testen Sie das Programm. - -Lenken Sie nun die Ausgabe von `System.out` in die Datei `output/console.log` um (siehe Konstante `LOGFILE`). Lassen Sie das Programm erneut laufen und betrachten Sie danach die Datei mit den umgeleiteten Daten. +```console +> java LineCounter ../src/LineCounter.java +Datei: ../src/LineCounter.java hat 30 Zeilen +``` ## Abgabe (optional) diff --git a/Assignment_057/solution/readme.md b/Assignment_057/solution/readme.md index 3ed3b1f..92e14d5 100644 --- a/Assignment_057/solution/readme.md +++ b/Assignment_057/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Konsolen Input/Output +# Lösung: Zeilen einer Textdatei zählen Musterlösung: -[pr2.io.konsole](../../solutions/src/main/java/pr2/io/konsole/) +[pr2.io.linecounter](../../solutions/src/main/java/pr2/io/linecounter/) diff --git a/Assignment_059/data.dat b/Assignment_058/data.dat similarity index 100% rename from Assignment_059/data.dat rename to Assignment_058/data.dat diff --git a/Assignment_058/readme.md b/Assignment_058/readme.md index 9c367d4..88bb8a5 100644 --- a/Assignment_058/readme.md +++ b/Assignment_058/readme.md @@ -1,21 +1,22 @@ -# Zeilen einer Textdatei zählen +# `RandomAccessFile` [Musterlösung](solution/) ## Lernziel -Dateien zeilenweise lesen und verarbeiten. +`RandomAccessFile` sowohl zum Lesen, als auch zum Schreiben von Daten einsetzen. Verstehen, dass man sich wahlfrei durch die Datei bewegen kann. ## Aufgabe -Gehen Sie in das Paket [pr2.io.linecounter](../sources/src/main/java/pr2/io/linecounter/). +Gehen Sie in das Paket [pr2.io.random_access](../sources/src/main/java/pr2/io/random_access/). -Schreiben Sie eine Klasse `LineCounter`, die den Namen einer Textdatei von der Kommandozeile entgegennimmt und dann die Anzahl der Zeilen in der Datei ausgibt. +Bei dieser Aufgabe werden Sie ein Verfahren anwenden, das bei sehr großen Datenmengen zum Einsatz kommt: das Sortieren der Daten direkt auf der Festplatte, ohne sie vollständig in den Hauptspeicher zu laden. -```console -> java LineCounter ../src/LineCounter.java -Datei: ../src/LineCounter.java hat 30 Zeilen -``` +Implementieren Sie einen [Bubblesort](https://de.wikipedia.org/wiki/Bubblesort) mithilfe von `RandomAccessFile` direkt auf einer Datei. Bubblesort ist ein ausgesprochen ineffizienter Algorithmus (O(n*n)), er ist aber sehr einfach zu implementieren. Da die zu sortierende Datei klein ist, können wir hier mit den Nachteilen von Bubblesort leben. + +Implementieren Sie die bereits vorhandene Methode `sortFile` der Klasse `FileSort`. Öffnen Sie zuerst die Datei mithilfe von `RandomAccessFile` im Modus `"rw"`. Wandern Sie nun - entsprechend dem Bubblesort-Algorithmus - über die Daten und sortieren Sie die Bytes der Datei. Halten Sie nie mehr als zwei `byte` und die Position als `long` im Speicher. Weitere Variablen können auch noch nötig sein, um den Algorithmus zu implementieren. + +Testen Sie Ihre Implementierung mit den JUnit-Tests. Die Testdatei für den Unit-Test ist [data.dat](../sources/src/main/resources/pr2/io/random_access/data.dat) ## Abgabe (optional) diff --git a/Assignment_058/solution/readme.md b/Assignment_058/solution/readme.md index 92e14d5..ccacd2b 100644 --- a/Assignment_058/solution/readme.md +++ b/Assignment_058/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Zeilen einer Textdatei zählen +# Lösung: `RandomAccessFile` Musterlösung: -[pr2.io.linecounter](../../solutions/src/main/java/pr2/io/linecounter/) +[pr2.io.random_access](../../solutions/src/main/java/pr2/io/random_access/) diff --git a/Assignment_060/kafka.txt b/Assignment_059/kafka.txt similarity index 100% rename from Assignment_060/kafka.txt rename to Assignment_059/kafka.txt diff --git a/Assignment_059/readme.md b/Assignment_059/readme.md index 88bb8a5..065deda 100644 --- a/Assignment_059/readme.md +++ b/Assignment_059/readme.md @@ -1,22 +1,16 @@ -# `RandomAccessFile` +# `Reader` verwenden [Musterlösung](solution/) ## Lernziel -`RandomAccessFile` sowohl zum Lesen, als auch zum Schreiben von Daten einsetzen. Verstehen, dass man sich wahlfrei durch die Datei bewegen kann. +Textdaten mithilfe von `Reader` verarbeiten. ## Aufgabe -Gehen Sie in das Paket [pr2.io.random_access](../sources/src/main/java/pr2/io/random_access/). +Gehen Sie in das Paket [pr2.io.reader_writer](../sources/src/main/java/pr2/io/reader_writer/). -Bei dieser Aufgabe werden Sie ein Verfahren anwenden, das bei sehr großen Datenmengen zum Einsatz kommt: das Sortieren der Daten direkt auf der Festplatte, ohne sie vollständig in den Hauptspeicher zu laden. - -Implementieren Sie einen [Bubblesort](https://de.wikipedia.org/wiki/Bubblesort) mithilfe von `RandomAccessFile` direkt auf einer Datei. Bubblesort ist ein ausgesprochen ineffizienter Algorithmus (O(n*n)), er ist aber sehr einfach zu implementieren. Da die zu sortierende Datei klein ist, können wir hier mit den Nachteilen von Bubblesort leben. - -Implementieren Sie die bereits vorhandene Methode `sortFile` der Klasse `FileSort`. Öffnen Sie zuerst die Datei mithilfe von `RandomAccessFile` im Modus `"rw"`. Wandern Sie nun - entsprechend dem Bubblesort-Algorithmus - über die Daten und sortieren Sie die Bytes der Datei. Halten Sie nie mehr als zwei `byte` und die Position als `long` im Speicher. Weitere Variablen können auch noch nötig sein, um den Algorithmus zu implementieren. - -Testen Sie Ihre Implementierung mit den JUnit-Tests. Die Testdatei für den Unit-Test ist [data.dat](../sources/src/main/resources/pr2/io/random_access/data.dat) +Lesen Sie die Datei [kafka.txt](../sources/src/main/resources/pr2/io/reader_writer/kafka.txt) mit einem passenden `Reader` ein und geben Sie sie auf der Konsole aus. Verwenden Sie nicht die `read()`-Methode, die einzelne Zeichen verarbeitet, sondern arbeiten Sie mit einem `char[]`-Buffer. ## Abgabe (optional) diff --git a/Assignment_059/solution/readme.md b/Assignment_059/solution/readme.md index ccacd2b..abbde00 100644 --- a/Assignment_059/solution/readme.md +++ b/Assignment_059/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: `RandomAccessFile` +# Lösung: `Reader` verwenden Musterlösung: -[pr2.io.random_access](../../solutions/src/main/java/pr2/io/random_access/) +[pr2.io.reader_writer](../../solutions/src/main/java/pr2/io/reader_writer/) diff --git a/Assignment_060/readme.md b/Assignment_060/readme.md index 065deda..bc07e18 100644 --- a/Assignment_060/readme.md +++ b/Assignment_060/readme.md @@ -1,16 +1,26 @@ -# `Reader` verwenden +# Rot13-Verschlüsselung [Musterlösung](solution/) ## Lernziel -Textdaten mithilfe von `Reader` verarbeiten. +Funktionsweise und Einsatz von Filtern. ## Aufgabe -Gehen Sie in das Paket [pr2.io.reader_writer](../sources/src/main/java/pr2/io/reader_writer/). +Gehen Sie in das Paket [pr2.io.rot13](../sources/src/main/java/pr2/io/rot13/). -Lesen Sie die Datei [kafka.txt](../sources/src/main/resources/pr2/io/reader_writer/kafka.txt) mit einem passenden `Reader` ein und geben Sie sie auf der Konsole aus. Verwenden Sie nicht die `read()`-Methode, die einzelne Zeichen verarbeitet, sondern arbeiten Sie mit einem `char[]`-Buffer. +Schreiben Sie eine Klasse `Rot13Reader`, die als Filter-Reader implementiert ist und jedes eingelesene Zeichen durch ein Zeichen ersetzt, dessen numerischer Wert um 13 höher ist (d.h. um 13 Schritte im Alphabet verschoben ist). + +Schreiben Sie eine Klasse `Rot13`, die einen Dateinamen von der Kommandozeile nimmt und diese Text-Datei mithilfe von `Rot13Reader` liest und auf der Konsole ausgibt. + +```console +> cat /tmp/test +DIES IST EIN TEXT, DER GLEICH ROT13 VERSCHLUESSELT WIRD. + +> java Rot13 /tmp/test +QVR`-V`a-RV[-aRea9-QR_-TYRVPU-_\a>@-cR_`PUYbR``RYa-dV_Q; +``` ## Abgabe (optional) diff --git a/Assignment_060/solution/readme.md b/Assignment_060/solution/readme.md index abbde00..afe6008 100644 --- a/Assignment_060/solution/readme.md +++ b/Assignment_060/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: `Reader` verwenden +# Lösung: Rot13-Verschlüsselung Musterlösung: -[pr2.io.reader_writer](../../solutions/src/main/java/pr2/io/reader_writer/) +[pr2.io.rot13](../../solutions/src/main/java/pr2/io/rot13/) diff --git a/Assignment_061/readme.md b/Assignment_061/readme.md index bc07e18..92bb47f 100644 --- a/Assignment_061/readme.md +++ b/Assignment_061/readme.md @@ -1,25 +1,28 @@ -# Rot13-Verschlüsselung +# Datei zerhacken [Musterlösung](solution/) ## Lernziel -Funktionsweise und Einsatz von Filtern. +Daten byteweise aus einem Stream lesen. ## Aufgabe -Gehen Sie in das Paket [pr2.io.rot13](../sources/src/main/java/pr2/io/rot13/). +Gehen Sie in das Paket [pr2.io.scrambler](../sources/src/main/java/pr2/io/scrambler/). -Schreiben Sie eine Klasse `Rot13Reader`, die als Filter-Reader implementiert ist und jedes eingelesene Zeichen durch ein Zeichen ersetzt, dessen numerischer Wert um 13 höher ist (d.h. um 13 Schritte im Alphabet verschoben ist). - -Schreiben Sie eine Klasse `Rot13`, die einen Dateinamen von der Kommandozeile nimmt und diese Text-Datei mithilfe von `Rot13Reader` liest und auf der Konsole ausgibt. +Schreiben Sie eine Klasse `Scrambler`, die einen Dateinamen von der Kommandozeile entgegennimmt, die Datei einliest und dann wieder auf der Konsole ausgibt. Allerdings soll bei der Ausgabe nur jedes zweite Byte berücksichtigt werden. ```console -> cat /tmp/test -DIES IST EIN TEXT, DER GLEICH ROT13 VERSCHLUESSELT WIRD. - -> java Rot13 /tmp/test -QVR`-V`a-RV[-aRea9-QR_-TYRVPU-_\a>@-cR_`PUYbR``RYa-dV_Q; +> java Scrambler ../src/Scrambler.java +motjv.oFlIpttem +motjv.oFlNtonEcpin +motjv.oIEcpin +pbi ls cabe + pbi ttcvi anSrn[ rs hosIEcpin{ i ag.egh! ){ Sse.r.rnl( + Bteen ae nee"; Sse.xt1; } + ienuSra i; + r + i e ienuSra(rs0) ``` diff --git a/Assignment_061/solution/readme.md b/Assignment_061/solution/readme.md index afe6008..ddb622a 100644 --- a/Assignment_061/solution/readme.md +++ b/Assignment_061/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Rot13-Verschlüsselung +# Lösung: Datei zerhacken Musterlösung: -[pr2.io.rot13](../../solutions/src/main/java/pr2/io/rot13/) +[pr2.io.scrambler](../../solutions/src/main/java/pr2/io/scrambler/) diff --git a/Assignment_062/readme.md b/Assignment_062/readme.md index 92bb47f..82d4841 100644 --- a/Assignment_062/readme.md +++ b/Assignment_062/readme.md @@ -1,29 +1,24 @@ -# Datei zerhacken +# Serialisierung [Musterlösung](solution/) ## Lernziel -Daten byteweise aus einem Stream lesen. +Serialisierung einsetzen können, um Objekte zu persistieren und wieder zu laden. ## Aufgabe -Gehen Sie in das Paket [pr2.io.scrambler](../sources/src/main/java/pr2/io/scrambler/). +Gehen Sie in das Paket [pr2.io.serialisierung](../sources/src/main/java/pr2/io/serialisierung/). -Schreiben Sie eine Klasse `Scrambler`, die einen Dateinamen von der Kommandozeile entgegennimmt, die Datei einliest und dann wieder auf der Konsole ausgibt. Allerdings soll bei der Ausgabe nur jedes zweite Byte berücksichtigt werden. +In dieser Aufgabe finden Sie bereits eine fertig implementierte Klasse `Board` vor, die ein Schachbrett repräsentiert. Allerdings wird dieses nicht für Schach benutzt, sondern für ein Spiel, bei dem man nur schwarze und weiße Steine auf das Brett stellen kann (z.B. Dame). Die Farbe der Steine wird durch die Enumeration `Color` dargestellt. -```console -> java Scrambler ../src/Scrambler.java -motjv.oFlIpttem -motjv.oFlNtonEcpin -motjv.oIEcpin -pbi ls cabe - pbi ttcvi anSrn[ rs hosIEcpin{ i ag.egh! ){ Sse.r.rnl( - Bteen ae nee"; Sse.xt1; } - ienuSra i; - r - i e ienuSra(rs0) -``` +Was bei dem Schachbrett allerdings noch fehlt, ist eine Möglichkeit den Spielstand zu speichern und später wieder einzulesen. + +Schauen Sie sich die Klassen `Board` und `Color` genau an und versuchen Sie diese zu verstehen. Sie können auch testweise ein Brett anlegen und mit Daten befüllen. (Wie dies geht, sehen Sie im JUnit-Test). Die `toString()`-Methode liefert eine anschauliche Darstellung des Spielfeldes. + +Implementieren Sie nun die Methoden `writeToFile` und `loadFromFile` unter Zuhilfenahme von Serialisierung. D.h. anders als in der Aufgabe zu `DataOutputStream`, sollen Sie hier kein eigenes Datenformat implementieren. Verwenden Sie stattdessen einen `ObjectOutputStream` bzw. `ObjectInputStream`. + +Lassen Sie den JUnit-Test laufen, um zu sehen, ob die Daten korrekt verarbeitet werden. Die Test-Datei für den Unit-Test ist [testdata.dat](../sources/src/main/resources/pr2/io/serialisierung/testdata.dat) ## Abgabe (optional) diff --git a/Assignment_062/solution/readme.md b/Assignment_062/solution/readme.md index ddb622a..a523dfa 100644 --- a/Assignment_062/solution/readme.md +++ b/Assignment_062/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Datei zerhacken +# Lösung: Serialisierung Musterlösung: -[pr2.io.scrambler](../../solutions/src/main/java/pr2/io/scrambler/) +[pr2.io.serialisierung](../../solutions/src/main/java/pr2/io/serialisierung/) diff --git a/Assignment_063/testdata.dat b/Assignment_062/testdata.dat similarity index 100% rename from Assignment_063/testdata.dat rename to Assignment_062/testdata.dat diff --git a/Assignment_063/readme.md b/Assignment_063/readme.md index 82d4841..e2bf877 100644 --- a/Assignment_063/readme.md +++ b/Assignment_063/readme.md @@ -1,24 +1,22 @@ -# Serialisierung +# Einen generischen Typ schreiben [Musterlösung](solution/) ## Lernziel -Serialisierung einsetzen können, um Objekte zu persistieren und wieder zu laden. +Einen vorhandenen Typ so umgestalten, dass er als generischer Typ verwendet werden kann. ## Aufgabe -Gehen Sie in das Paket [pr2.io.serialisierung](../sources/src/main/java/pr2/io/serialisierung/). +Gehen Sie in das Paket [pr2.generics.einfach](../sources/src/main/java/pr2/generics/einfach/). -In dieser Aufgabe finden Sie bereits eine fertig implementierte Klasse `Board` vor, die ein Schachbrett repräsentiert. Allerdings wird dieses nicht für Schach benutzt, sondern für ein Spiel, bei dem man nur schwarze und weiße Steine auf das Brett stellen kann (z.B. Dame). Die Farbe der Steine wird durch die Enumeration `Color` dargestellt. +Sie finden mit `Liste` eine sehr simple Implementierung einer einfach verketteten Liste vor. Zusätzlich gib es auch noch Tests, die die Liste testen. -Was bei dem Schachbrett allerdings noch fehlt, ist eine Möglichkeit den Spielstand zu speichern und später wieder einzulesen. +Führen Sie die Tests aus und überzeugen Sie sich, dass die Liste korrekt funktioniert. -Schauen Sie sich die Klassen `Board` und `Color` genau an und versuchen Sie diese zu verstehen. Sie können auch testweise ein Brett anlegen und mit Daten befüllen. (Wie dies geht, sehen Sie im JUnit-Test). Die `toString()`-Methode liefert eine anschauliche Darstellung des Spielfeldes. +Schreiben Sie die Klasse `Liste` so um, dass sie zu einem generischen Typ wird. Dies bedeutet insbesondere, dass die Methoden `get` und `add` nicht mehr mit `Object` arbeiten, sondern typsicher werden. Sie dürfen in Ihrer Lösung __keine Casts__ verwenden, d.h. Sie müssen sich auch mit der Klasse `ListNode` beschäftigen und hier Änderungen vornehmen. -Implementieren Sie nun die Methoden `writeToFile` und `loadFromFile` unter Zuhilfenahme von Serialisierung. D.h. anders als in der Aufgabe zu `DataOutputStream`, sollen Sie hier kein eigenes Datenformat implementieren. Verwenden Sie stattdessen einen `ObjectOutputStream` bzw. `ObjectInputStream`. - -Lassen Sie den JUnit-Test laufen, um zu sehen, ob die Daten korrekt verarbeitet werden. Die Test-Datei für den Unit-Test ist [testdata.dat](../sources/src/main/resources/pr2/io/serialisierung/testdata.dat) +Führen Sie die Tests erneut aus, um sicherzugehen, dass Sie bei Ihren Änderungen nichts kaputt gemacht haben. ## Abgabe (optional) diff --git a/Assignment_063/solution/readme.md b/Assignment_063/solution/readme.md index a523dfa..1a645c1 100644 --- a/Assignment_063/solution/readme.md +++ b/Assignment_063/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Serialisierung +# Lösung: Einen generischen Typ schreiben Musterlösung: -[pr2.io.serialisierung](../../solutions/src/main/java/pr2/io/serialisierung/) +[pr2.generics.einfach](../../solutions/src/main/java/pr2/generics/einfach/) diff --git a/Assignment_064/readme.md b/Assignment_064/readme.md index e2bf877..2deee4e 100644 --- a/Assignment_064/readme.md +++ b/Assignment_064/readme.md @@ -1,22 +1,18 @@ -# Einen generischen Typ schreiben +# Generische Klasse Pair schreiben [Musterlösung](solution/) ## Lernziel -Einen vorhandenen Typ so umgestalten, dass er als generischer Typ verwendet werden kann. +Von einem generischen Typ erben. ## Aufgabe -Gehen Sie in das Paket [pr2.generics.einfach](../sources/src/main/java/pr2/generics/einfach/). +Gehen Sie in das Paket [pr2.generics.pair](../sources/src/main/java/pr2/generics/pair/). -Sie finden mit `Liste` eine sehr simple Implementierung einer einfach verketteten Liste vor. Zusätzlich gib es auch noch Tests, die die Liste testen. +Schreiben Sie eine generische Klasse `Pair`, die zwei Objekte unterschiedlichen Typs verwalten kann. Die Instanzen von `Pair` sollen unveränderlich (**immutable**) sein. -Führen Sie die Tests aus und überzeugen Sie sich, dass die Liste korrekt funktioniert. - -Schreiben Sie die Klasse `Liste` so um, dass sie zu einem generischen Typ wird. Dies bedeutet insbesondere, dass die Methoden `get` und `add` nicht mehr mit `Object` arbeiten, sondern typsicher werden. Sie dürfen in Ihrer Lösung __keine Casts__ verwenden, d.h. Sie müssen sich auch mit der Klasse `ListNode` beschäftigen und hier Änderungen vornehmen. - -Führen Sie die Tests erneut aus, um sicherzugehen, dass Sie bei Ihren Änderungen nichts kaputt gemacht haben. +Testen Sie Ihre Implementierung mit der vorhandenen `Main`-Klasse. ## Abgabe (optional) diff --git a/Assignment_064/solution/readme.md b/Assignment_064/solution/readme.md index 1a645c1..e4303a8 100644 --- a/Assignment_064/solution/readme.md +++ b/Assignment_064/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Einen generischen Typ schreiben +# Lösung: Generische Klasse Pair schreiben Musterlösung: -[pr2.generics.einfach](../../solutions/src/main/java/pr2/generics/einfach/) +[pr2.generics.pair](../../solutions/src/main/java/pr2/generics/pair/) diff --git a/Assignment_065/readme.md b/Assignment_065/readme.md index 2deee4e..7937624 100644 --- a/Assignment_065/readme.md +++ b/Assignment_065/readme.md @@ -1,4 +1,4 @@ -# Generische Klasse Pair schreiben +# Generische Klasse Pair erweitern: NumberPair [Musterlösung](solution/) @@ -8,9 +8,9 @@ Von einem generischen Typ erben. ## Aufgabe -Gehen Sie in das Paket [pr2.generics.pair](../sources/src/main/java/pr2/generics/pair/). +Gehen Sie in das Paket [pr2.generics.number_pair](../sources/src/main/java/pr2/generics/number_pair/). -Schreiben Sie eine generische Klasse `Pair`, die zwei Objekte unterschiedlichen Typs verwalten kann. Die Instanzen von `Pair` sollen unveränderlich (**immutable**) sein. +Schreiben Sie eine generische Klasse `NumberPair`, die von der Klasse `Pair` aus der vorhergehenden Aufgabe abgeleitet ist und erzwingt, dass beide verwaltete Objekte von `Number` oder einer Subklasse von `Number` (`Double`, `Integer`, `Long` etc.) sind. Testen Sie Ihre Implementierung mit der vorhandenen `Main`-Klasse. diff --git a/Assignment_065/solution/readme.md b/Assignment_065/solution/readme.md index e4303a8..da73c86 100644 --- a/Assignment_065/solution/readme.md +++ b/Assignment_065/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Generische Klasse Pair schreiben +# Lösung: Generische Klasse Pair erweitern: NumberPair Musterlösung: -[pr2.generics.pair](../../solutions/src/main/java/pr2/generics/pair/) +[pr2.generics.number_pair](../../solutions/src/main/java/pr2/generics/number_pair/) diff --git a/Assignment_066/readme.md b/Assignment_066/readme.md index 7937624..98caebb 100644 --- a/Assignment_066/readme.md +++ b/Assignment_066/readme.md @@ -1,4 +1,4 @@ -# Generische Klasse Pair erweitern: NumberPair +# Generische Klasse Pair erweitern: SamePair [Musterlösung](solution/) @@ -8,9 +8,9 @@ Von einem generischen Typ erben. ## Aufgabe -Gehen Sie in das Paket [pr2.generics.number_pair](../sources/src/main/java/pr2/generics/number_pair/). +Gehen Sie in das Paket [pr2.generics.same_pair](../sources/src/main/java/pr2/generics/same_pair/). -Schreiben Sie eine generische Klasse `NumberPair`, die von der Klasse `Pair` aus der vorhergehenden Aufgabe abgeleitet ist und erzwingt, dass beide verwaltete Objekte von `Number` oder einer Subklasse von `Number` (`Double`, `Integer`, `Long` etc.) sind. +Schreiben Sie eine generische Klasse `SamePair`, die von der Klasse `Pair` aus der vorhergehenden Aufgabe abgeleitet ist und erzwingt, dass beide verwaltete Objekte vom selben Typ sind. Testen Sie Ihre Implementierung mit der vorhandenen `Main`-Klasse. diff --git a/Assignment_066/solution/readme.md b/Assignment_066/solution/readme.md index da73c86..a8c9b5c 100644 --- a/Assignment_066/solution/readme.md +++ b/Assignment_066/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Generische Klasse Pair erweitern: NumberPair +# Lösung: Generische Klasse Pair erweitern: SamePair Musterlösung: -[pr2.generics.number_pair](../../solutions/src/main/java/pr2/generics/number_pair/) +[pr2.generics.same_pair](../../solutions/src/main/java/pr2/generics/same_pair/) diff --git a/Assignment_067/readme.md b/Assignment_067/readme.md index 98caebb..11159a6 100644 --- a/Assignment_067/readme.md +++ b/Assignment_067/readme.md @@ -1,16 +1,16 @@ -# Generische Klasse Pair erweitern: SamePair +# PairList [Musterlösung](solution/) ## Lernziel -Von einem generischen Typ erben. +Sammlungen von Objekten eines generischen Typs erstellen. ## Aufgabe -Gehen Sie in das Paket [pr2.generics.same_pair](../sources/src/main/java/pr2/generics/same_pair/). +Gehen Sie in das Paket [pr2.generics.pairlist](../sources/src/main/java/pr2/generics/pairlist/). -Schreiben Sie eine generische Klasse `SamePair`, die von der Klasse `Pair` aus der vorhergehenden Aufgabe abgeleitet ist und erzwingt, dass beide verwaltete Objekte vom selben Typ sind. +Schreiben Sie eine generische Klasse `PairList`, die eine beliebige Anzahl von `Pair`-Objekten verwalten kann. Die Anzahl der maximal gespeicherten Objekte wird beim Erzeugen mitgegeben. Die Klasse erlaubt das Hinzufügen (`add`) und das Auslesen von Objekten anhand des Indexes (`get`). Testen Sie Ihre Implementierung mit der vorhandenen `Main`-Klasse. diff --git a/Assignment_067/solution/readme.md b/Assignment_067/solution/readme.md index a8c9b5c..7a66bc8 100644 --- a/Assignment_067/solution/readme.md +++ b/Assignment_067/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Generische Klasse Pair erweitern: SamePair +# Lösung: PairList Musterlösung: -[pr2.generics.same_pair](../../solutions/src/main/java/pr2/generics/same_pair/) +[pr2.generics.pairlist](../../solutions/src/main/java/pr2/generics/pairlist/) diff --git a/Assignment_068/readme.md b/Assignment_068/readme.md index 11159a6..1a70ac6 100644 --- a/Assignment_068/readme.md +++ b/Assignment_068/readme.md @@ -1,18 +1,16 @@ -# PairList +# Wildcard benutzen [Musterlösung](solution/) ## Lernziel -Sammlungen von Objekten eines generischen Typs erstellen. +Wildcards einsetzen. ## Aufgabe -Gehen Sie in das Paket [pr2.generics.pairlist](../sources/src/main/java/pr2/generics/pairlist/). +Gehen Sie in das Paket [pr2.generics.printer](../sources/src/main/java/pr2/generics/printer/). -Schreiben Sie eine generische Klasse `PairList`, die eine beliebige Anzahl von `Pair`-Objekten verwalten kann. Die Anzahl der maximal gespeicherten Objekte wird beim Erzeugen mitgegeben. Die Klasse erlaubt das Hinzufügen (`add`) und das Auslesen von Objekten anhand des Indexes (`get`). - -Testen Sie Ihre Implementierung mit der vorhandenen `Main`-Klasse. +Schreiben Sie eine Klasse `CollectionPrinter` mit einer statischen Methode `print`, der man eine beliebige (generische) Collection übergeben kann und die dann deren Inhalt ausdruckt. Eine _Collection_ ist eine Klasse, die beliebig viele Objekte verwalten kann und über die man mit der _for each_-Schleife iterieren kann. ## Abgabe (optional) diff --git a/Assignment_068/solution/readme.md b/Assignment_068/solution/readme.md index 7a66bc8..510b1f5 100644 --- a/Assignment_068/solution/readme.md +++ b/Assignment_068/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: PairList +# Lösung: Wildcard benutzen Musterlösung: -[pr2.generics.pairlist](../../solutions/src/main/java/pr2/generics/pairlist/) +[pr2.generics.printer](../../solutions/src/main/java/pr2/generics/printer/) diff --git a/Assignment_069/readme.md b/Assignment_069/readme.md index 1a70ac6..2e9893d 100644 --- a/Assignment_069/readme.md +++ b/Assignment_069/readme.md @@ -1,16 +1,20 @@ -# Wildcard benutzen +# Generische Queue [Musterlösung](solution/) ## Lernziel -Wildcards einsetzen. +Einen komplexeren generischen Typ entwickeln. ## Aufgabe -Gehen Sie in das Paket [pr2.generics.printer](../sources/src/main/java/pr2/generics/printer/). +Gehen Sie in das Paket [pr2.generics.queue](../sources/src/main/java/pr2/generics/queue/). -Schreiben Sie eine Klasse `CollectionPrinter` mit einer statischen Methode `print`, der man eine beliebige (generische) Collection übergeben kann und die dann deren Inhalt ausdruckt. Eine _Collection_ ist eine Klasse, die beliebig viele Objekte verwalten kann und über die man mit der _for each_-Schleife iterieren kann. +Schreiben Sie eine generische Klasse `Queue`, die eine einfache Warteschlange (Queue) realisiert. Über die Methode `offer` können Objekte hinzugefügt werden, über `poll` wieder ausgelesen. Über Probleme des Over- und Underflows brauchen Sie sich hier keine Gedanken zu machen. + +Erweitern Sie die Klasse `Queue` um eine Methode `addAll`, der man eine andere `Queue` übergibt und die dann alle Elemente der übergebenen Queue in die aktuelle übernimmt. + +Erweitern Sie die Klasse `Queue` aus der vorhergehenden Aufgabe um eine Methode `copyInto`, der man eine andere `Queue` übergibt und die dann alle Elemente der aktuellen Queue in die übergebenen kopiert. ## Abgabe (optional) diff --git a/Assignment_069/solution/readme.md b/Assignment_069/solution/readme.md index 510b1f5..68a84e8 100644 --- a/Assignment_069/solution/readme.md +++ b/Assignment_069/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Wildcard benutzen +# Lösung: Generische Queue Musterlösung: -[pr2.generics.printer](../../solutions/src/main/java/pr2/generics/printer/) +[pr2.generics.queue](../../solutions/src/main/java/pr2/generics/queue/) diff --git a/Assignment_070/readme.md b/Assignment_070/readme.md index 2e9893d..584a648 100644 --- a/Assignment_070/readme.md +++ b/Assignment_070/readme.md @@ -1,20 +1,25 @@ -# Generische Queue +# `super` und `extends` einsetzen [Musterlösung](solution/) ## Lernziel -Einen komplexeren generischen Typ entwickeln. +Methoden unter Verwendung von `super` und `extends` gestalten, sodass sie flexibel auch mit Sub- bzw. Supertypen umgehen können. ## Aufgabe -Gehen Sie in das Paket [pr2.generics.queue](../sources/src/main/java/pr2/generics/queue/). +Gehen Sie in das Paket [pr2.generics.super_extends](../sources/src/main/java/pr2/generics/super_extends/). -Schreiben Sie eine generische Klasse `Queue`, die eine einfache Warteschlange (Queue) realisiert. Über die Methode `offer` können Objekte hinzugefügt werden, über `poll` wieder ausgelesen. Über Probleme des Over- und Underflows brauchen Sie sich hier keine Gedanken zu machen. +In dieser Aufgabe sollen Sie die Klasse `Liste` erweitern. -Erweitern Sie die Klasse `Queue` um eine Methode `addAll`, der man eine andere `Queue` übergibt und die dann alle Elemente der übergebenen Queue in die aktuelle übernimmt. +Fügen Sie `Liste` zwei Methoden hinzu: -Erweitern Sie die Klasse `Queue` aus der vorhergehenden Aufgabe um eine Methode `copyInto`, der man eine andere `Queue` übergibt und die dann alle Elemente der aktuellen Queue in die übergebenen kopiert. + * `fillFrom`: befüllt die Liste mit den Daten aus einer anderen (übergebene) Liste. + * `copyInto`: kopiert die Daten der Liste in eine andere (übergebene) Liste. + +Verwenden Sie für Ihre Lösung `super` und `extends` zusammen mit Wildcards (`?`). + +Kommentieren Sie die Testmethode in den vorhandenen Tests ein und führen Sie diese danach aus. Versichern Sie sich, dass Ihre Implementierung korrekt funktioniert, bevor Sie die Lösung abgeben. ## Abgabe (optional) diff --git a/Assignment_070/solution/readme.md b/Assignment_070/solution/readme.md index 68a84e8..6321f6a 100644 --- a/Assignment_070/solution/readme.md +++ b/Assignment_070/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Generische Queue +# Lösung: `super` und `extends` einsetzen Musterlösung: -[pr2.generics.queue](../../solutions/src/main/java/pr2/generics/queue/) +[pr2.generics.super_extends](../../solutions/src/main/java/pr2/generics/super_extends/) diff --git a/Assignment_071/readme.md b/Assignment_071/readme.md index 584a648..a351cdf 100644 --- a/Assignment_071/readme.md +++ b/Assignment_071/readme.md @@ -1,25 +1,39 @@ -# `super` und `extends` einsetzen +# Generische Typen zusammen mit Wildcards einsetzen [Musterlösung](solution/) ## Lernziel -Methoden unter Verwendung von `super` und `extends` gestalten, sodass sie flexibel auch mit Sub- bzw. Supertypen umgehen können. +Gebundene und ungebundene Wildcards einsetzen. ## Aufgabe -Gehen Sie in das Paket [pr2.generics.super_extends](../sources/src/main/java/pr2/generics/super_extends/). +Gehen Sie in das Paket [pr2.generics.wildcards](../sources/src/main/java/pr2/generics/wildcards/). -In dieser Aufgabe sollen Sie die Klasse `Liste` erweitern. +In dieser Aufgabe finden Sie bereits eine Implementierung einer generischen, auf Arrays basierenden Liste namens `SimpleList` vor. An dieser müssen Sie nichts verändern, sondern verwenden die Klasse wie sie ist. -Fügen Sie `Liste` zwei Methoden hinzu: +Schreiben Sie nun eine _nicht generische_ Klasse `ListHelper`, die zwei statische Methoden enthält: - * `fillFrom`: befüllt die Liste mit den Daten aus einer anderen (übergebene) Liste. - * `copyInto`: kopiert die Daten der Liste in eine andere (übergebene) Liste. + * `printList`: Diese Methode bekommt eine beliebige `SimpleList` übergeben und druckt deren Inhalt einfach auf der Konsole aus. Deswegen hat die Methode auch den Rückgabetyp `void`. + * `sumList`: Diese Methode nimmt als Parameter `SimpleList`-Objekte, die irgendeine Form von Zahlen enthalten (`Number` oder Subklassen davon) und berechnet deren Summe. Das Ergebnis wird als `double`-Wert zurückgegeben. -Verwenden Sie für Ihre Lösung `super` und `extends` zusammen mit Wildcards (`?`). +Verwenden Sie für die Methoden gebundene bzw. ungebundene Wildcards. -Kommentieren Sie die Testmethode in den vorhandenen Tests ein und führen Sie diese danach aus. Versichern Sie sich, dass Ihre Implementierung korrekt funktioniert, bevor Sie die Lösung abgeben. +Kommentieren Sie die entsprechenden Zeilen in der Klasse `Main` aus und sehen überprüfen Sie, ob Ihre Implementierungen auch wie gewünscht funktionieren. Die Ausgabe sollte sein: + +```console +Dies +ist +ein +Test +. +1 +2 +3 +4 +5 +15.0 +``` ## Abgabe (optional) diff --git a/Assignment_071/solution/readme.md b/Assignment_071/solution/readme.md index 6321f6a..3cd4d43 100644 --- a/Assignment_071/solution/readme.md +++ b/Assignment_071/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: `super` und `extends` einsetzen +# Lösung: Generische Typen zusammen mit Wildcards einsetzen Musterlösung: -[pr2.generics.super_extends](../../solutions/src/main/java/pr2/generics/super_extends/) +[pr2.generics.wildcards](../../solutions/src/main/java/pr2/generics/wildcards/). diff --git a/Assignment_072/readme.md b/Assignment_072/readme.md index bf6be09..4957e66 100644 --- a/Assignment_072/readme.md +++ b/Assignment_072/readme.md @@ -1,22 +1,16 @@ -# Generischen Typ verwenden +# Eigene compare-Methode schreiben [Musterlösung](solution/) ## Lernziel -Einen vorgegebenen generischen Typ einsetzen, um typsicher eine Menge von Objekten zu verwalten. +Objekte vergleichen. ## Aufgabe -Gehen Sie in das Paket [pr2.generics.verwenden](../sources/src/main/java/pr2/generics/verwenden/). +Gehen Sie in das Paket [pr2.lambda.array_sorter](../sources/src/main/java/pr2/lambda/array_sorter/). -In dieser Aufgabe werden Sie ein einfaches Spiel implementieren, mit bei dem man einen Stapel Münzen möglichst schnell abräumen muss. Man nimmt eine Münze, indem man auf sie klickt. Jede Münze gibt dieselbe Anzahl von Punkten. Es geht also eher um das schnelle Klicken. - -Die Münzen liegen als Stapel (_Stack_) vor, d.h. man kann immer nur die oberste Münze herunternehmen. Um dies in dem Spiel zu realisieren, sollen Sie den vorgefertigten, generischen Datentyp `Stack` verwenden, den Sie im Paket `java.util` finden. - -Bei dieser Aufgabe sollen Sie _nicht_ die Klasse `GameBoard` generisch machen, sondern innerhalb der Klasse den `Stack` als generischen Typ verwenden. - -Öffnen Sie die Klasse `GameBoard` und orientieren Sie sich bei Ihren Änderungen an den `TODO`-Kommentaren. +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. ## Abgabe (optional) diff --git a/Assignment_072/solution/readme.md b/Assignment_072/solution/readme.md index d1c0905..183c8af 100644 --- a/Assignment_072/solution/readme.md +++ b/Assignment_072/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Generischen Typ verwenden +# Lösung: Eigene compare-Methode schreiben Musterlösung: -[pr2.generics.verwenden](../../solutions/src/main/java/pr2/generics/verwenden/). +[pr2.lambda.array_sorter](../../solutions/src/main/java/pr2/lambda/array_sorter/) diff --git a/Assignment_073/readme.md b/Assignment_073/readme.md index a351cdf..075bcf9 100644 --- a/Assignment_073/readme.md +++ b/Assignment_073/readme.md @@ -1,39 +1,20 @@ -# Generische Typen zusammen mit Wildcards einsetzen +# Innere Klasse Beobachter [Musterlösung](solution/) ## Lernziel -Gebundene und ungebundene Wildcards einsetzen. +Zugriff von inneren Klassen auf die umgebende Klasse. ## Aufgabe -Gehen Sie in das Paket [pr2.generics.wildcards](../sources/src/main/java/pr2/generics/wildcards/). +Gehen Sie in das Paket: [pr2.lambda.observer](../sources/src/main/java/pr2/lambda/observer/). -In dieser Aufgabe finden Sie bereits eine Implementierung einer generischen, auf Arrays basierenden Liste namens `SimpleList` vor. An dieser müssen Sie nichts verändern, sondern verwenden die Klasse wie sie ist. +Dort finden Sie das Interface `Beobachter`. -Schreiben Sie nun eine _nicht generische_ Klasse `ListHelper`, die zwei statische Methoden enthält: +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. - * `printList`: Diese Methode bekommt eine beliebige `SimpleList` übergeben und druckt deren Inhalt einfach auf der Konsole aus. Deswegen hat die Methode auch den Rückgabetyp `void`. - * `sumList`: Diese Methode nimmt als Parameter `SimpleList`-Objekte, die irgendeine Form von Zahlen enthalten (`Number` oder Subklassen davon) und berechnet deren Summe. Das Ergebnis wird als `double`-Wert zurückgegeben. - -Verwenden Sie für die Methoden gebundene bzw. ungebundene Wildcards. - -Kommentieren Sie die entsprechenden Zeilen in der Klasse `Main` aus und sehen überprüfen Sie, ob Ihre Implementierungen auch wie gewünscht funktionieren. Die Ausgabe sollte sein: - -```console -Dies -ist -ein -Test -. -1 -2 -3 -4 -5 -15.0 -``` +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) diff --git a/Assignment_073/solution/readme.md b/Assignment_073/solution/readme.md index 3cd4d43..fe048c7 100644 --- a/Assignment_073/solution/readme.md +++ b/Assignment_073/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Generische Typen zusammen mit Wildcards einsetzen +# Lösung: Innere Klasse Beobachter Musterlösung: -[pr2.generics.wildcards](../../solutions/src/main/java/pr2/generics/wildcards/). +[pr2.lambda.observer](../../solutions/src/main/java/pr2/lambda/observer/). diff --git a/Assignment_074/readme.md b/Assignment_074/readme.md index 4957e66..4a72e78 100644 --- a/Assignment_074/readme.md +++ b/Assignment_074/readme.md @@ -1,16 +1,20 @@ -# Eigene compare-Methode schreiben +# Callback mit anonymer Klasse realisieren [Musterlösung](solution/) ## Lernziel -Objekte vergleichen. +Eine gegebene Funktion durch einen Callback parametrieren. Der Callback wird als anonyme innere Klasse realisiert. ## 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.callback](../sources/src/main/java/pr2/lambda/callback/). -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 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. + +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. + +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) diff --git a/Assignment_074/solution/readme.md b/Assignment_074/solution/readme.md index 183c8af..f3f2c66 100644 --- a/Assignment_074/solution/readme.md +++ b/Assignment_074/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Eigene compare-Methode schreiben +# Lösung: Callback mit anonymer Klasse realisieren Musterlösung: -[pr2.lambda.array_sorter](../../solutions/src/main/java/pr2/lambda/array_sorter/) +[pr2.lambda.callback](../../solutions/src/main/java/pr2/lambda/callback/) diff --git a/Assignment_075/readme.md b/Assignment_075/readme.md index 075bcf9..da32b09 100644 --- a/Assignment_075/readme.md +++ b/Assignment_075/readme.md @@ -1,20 +1,19 @@ -# Innere Klasse Beobachter +# Comparator als Lambda [Musterlösung](solution/) ## Lernziel -Zugriff von inneren Klassen auf die umgebende Klasse. +Lambdas verwenden. ## Aufgabe -Gehen Sie in das Paket: [pr2.lambda.observer](../sources/src/main/java/pr2/lambda/observer/). +Gehen Sie in das Paket +[pr2.lambda.comparator](../sources/src/main/java/pr2/lambda/comparator/). -Dort finden Sie das Interface `Beobachter`. +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. -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. +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. ## Abgabe (optional) diff --git a/Assignment_075/solution/readme.md b/Assignment_075/solution/readme.md index fe048c7..43f250d 100644 --- a/Assignment_075/solution/readme.md +++ b/Assignment_075/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Innere Klasse Beobachter +# Lösung: Comparator als Lambda Musterlösung: -[pr2.lambda.observer](../../solutions/src/main/java/pr2/lambda/observer/). +[pr2.lambda.comparator](../../solutions/src/main/java/pr2/lambda/comparator/) diff --git a/Assignment_076/readme.md b/Assignment_076/readme.md index 4a72e78..3916f96 100644 --- a/Assignment_076/readme.md +++ b/Assignment_076/readme.md @@ -1,21 +1,23 @@ -# Callback mit anonymer Klasse realisieren +# Callback mit Lambda realisieren [Musterlösung](solution/) ## Lernziel -Eine gegebene Funktion durch einen Callback parametrieren. Der Callback wird als anonyme innere Klasse realisiert. +Eine gegebene Funktion durch einen Callback parametrieren. Der Callback wird als Lambda realisiert. ## Aufgabe -Gehen Sie in das Paket [pr2.lambda.callback](../sources/src/main/java/pr2/lambda/callback/). +Gehen Sie in das Paket [pr2.lambda.lambdas](../sources/src/main/java/pr2/lambda/lambdas/). 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. -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. +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) diff --git a/Assignment_076/solution/readme.md b/Assignment_076/solution/readme.md index f3f2c66..dec56e3 100644 --- a/Assignment_076/solution/readme.md +++ b/Assignment_076/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Callback mit anonymer Klasse realisieren +# Lösung: Callback mit Lambda realisieren Musterlösung: -[pr2.lambda.callback](../../solutions/src/main/java/pr2/lambda/callback/) +[pr2.lambda.lambdas](../../solutions/src/main/java/pr2/lambda/lambdas/) diff --git a/Assignment_077/readme.md b/Assignment_077/readme.md index da32b09..1bb5de3 100644 --- a/Assignment_077/readme.md +++ b/Assignment_077/readme.md @@ -1,19 +1,18 @@ -# Comparator als Lambda +# MatrixSuche [Musterlösung](solution/) ## Lernziel -Lambdas verwenden. +Statische innere Klassen einsetzen. ## Aufgabe -Gehen Sie in das Paket -[pr2.lambda.comparator](../sources/src/main/java/pr2/lambda/comparator/). +Gehen Sie in das Paket [pr2.lambda.matrixsuche](../sources/src/main/java/pr2/lambda/matrixsuche/). -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. +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. -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. +Überschreiben Sie die `toString`-Methode in `Position` und testen Sie, ob Ihre Implementierung richtig funktioniert. ## Abgabe (optional) diff --git a/Assignment_077/solution/readme.md b/Assignment_077/solution/readme.md index 43f250d..e3b7c01 100644 --- a/Assignment_077/solution/readme.md +++ b/Assignment_077/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Comparator als Lambda +# Lösung: MatrixSuche Musterlösung: -[pr2.lambda.comparator](../../solutions/src/main/java/pr2/lambda/comparator/) +[pr2.lambda.matrixsuche](../../solutions/src/main/java/pr2/lambda/matrixsuche/) diff --git a/Assignment_078/readme.md b/Assignment_078/readme.md index 3916f96..9f77b27 100644 --- a/Assignment_078/readme.md +++ b/Assignment_078/readme.md @@ -1,22 +1,24 @@ -# Callback mit Lambda realisieren +# StringTransmogrifier [Musterlösung](solution/) ## Lernziel -Eine gegebene Funktion durch einen Callback parametrieren. Der Callback wird als Lambda realisiert. +Funktionale Interfaces entwerfen und verwenden. ## Aufgabe -Gehen Sie in das Paket [pr2.lambda.lambdas](../sources/src/main/java/pr2/lambda/lambdas/). +Gehen Sie in das Paket [pr2.lambda.mogrifier_1](../sources/src/main/java/pr2/lambda/mogrifier_1/). -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 ein funktionales Interface namens `StringFunction`. Die Methode des Interfaces nimmt eine String und gibt einen String zurück. -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. +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. -Nachdem Sie die beiden Filter geschrieben haben, lassen Sie das Programm laufen und überprüfen Sie, ob wirklich die richtigen Zahlen ausgewählt werden. +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: -Vergleichen Sie die Lösung mit Lambdas mit der aus der vorhergehenden Aufgabe, die auf anonymen inneren Klassen basiert hat. + * Umwandeln aller Buchstaben in Kleinbuchstaben. + * Umwandeln aller Buchstaben in Großbuchstaben. + * Ersetzen jedes Buchstaben durch den im Alphabet folgenden. ## Abgabe (optional) diff --git a/Assignment_078/solution/readme.md b/Assignment_078/solution/readme.md index dec56e3..8bf44e0 100644 --- a/Assignment_078/solution/readme.md +++ b/Assignment_078/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Callback mit Lambda realisieren +# Lösung: StringTransmogrifier Musterlösung: -[pr2.lambda.lambdas](../../solutions/src/main/java/pr2/lambda/lambdas/) +[pr2.lambda.mogrifier_1](../../solutions/src/main/java/pr2/lambda/mogrifier_1/) diff --git a/Assignment_079/readme.md b/Assignment_079/readme.md index 1bb5de3..2b68bbd 100644 --- a/Assignment_079/readme.md +++ b/Assignment_079/readme.md @@ -1,18 +1,18 @@ -# MatrixSuche +# StringTransmogrifier erweitern [Musterlösung](solution/) ## Lernziel -Statische innere Klassen einsetzen. +Funktionale Interfaces entwerfen und verwenden. ## 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) diff --git a/Assignment_079/solution/readme.md b/Assignment_079/solution/readme.md index e3b7c01..9746d8f 100644 --- a/Assignment_079/solution/readme.md +++ b/Assignment_079/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: MatrixSuche +# Lösung: StringTransmogrifier erweitern Musterlösung: -[pr2.lambda.matrixsuche](../../solutions/src/main/java/pr2/lambda/matrixsuche/) +[pr2.lambda.mogrifier_2](../../solutions/src/main/java/pr2/lambda/mogrifier_2/) diff --git a/Assignment_080/readme.md b/Assignment_080/readme.md index 9f77b27..3371860 100644 --- a/Assignment_080/readme.md +++ b/Assignment_080/readme.md @@ -1,24 +1,20 @@ -# StringTransmogrifier +# Iterator schreiben [Musterlösung](solution/) ## Lernziel -Funktionale Interfaces entwerfen und verwenden. +Für eine gegebene Klasse einen Iterator schreiben. ## Aufgabe -Gehen Sie in das Paket [pr2.lambda.mogrifier_1](../sources/src/main/java/pr2/lambda/mogrifier_1/). +Gehen Sie in das Paket [pr2.collections.iterator](../sources/src/main/java/pr2/collections/iterator/). -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 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. -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. +Implementieren Sie in `SimpleStack` das Interface `Iterable` 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. -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: - - * Umwandeln aller Buchstaben in Kleinbuchstaben. - * Umwandeln aller Buchstaben in Großbuchstaben. - * Ersetzen jedes Buchstaben durch den im Alphabet folgenden. +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) diff --git a/Assignment_080/solution/readme.md b/Assignment_080/solution/readme.md index 8bf44e0..2af19d3 100644 --- a/Assignment_080/solution/readme.md +++ b/Assignment_080/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: StringTransmogrifier +# Lösung: Iterator schreiben Musterlösung: -[pr2.lambda.mogrifier_1](../../solutions/src/main/java/pr2/lambda/mogrifier_1/) +[pr2.collections.iterator](../../solutions/src/main/java/pr2/collections/iterator/) diff --git a/Assignment_081/readme.md b/Assignment_081/readme.md index 2b68bbd..03fc5f4 100644 --- a/Assignment_081/readme.md +++ b/Assignment_081/readme.md @@ -1,18 +1,16 @@ -# StringTransmogrifier erweitern +# Iterator programmieren [Musterlösung](solution/) ## Lernziel -Funktionale Interfaces entwerfen und verwenden. +Iteratoren verstehen und programmieren. ## Aufgabe -Gehen Sie in das Paket [pr2.lambda.mogrifier_2](../sources/src/main/java/pr2/lambda/mogrifier_2/). +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`. -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. - -Teste Sie Ihre Implementierung wieder mit `StringTransmogrifierTest`. +Geben Sie bitte den fehlenden Code für die innere Klasse `ListenIterator` an. ## Abgabe (optional) diff --git a/Assignment_081/solution/readme.md b/Assignment_081/solution/readme.md index 9746d8f..85889cd 100644 --- a/Assignment_081/solution/readme.md +++ b/Assignment_081/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: StringTransmogrifier erweitern +# Lösung: Iterator programmieren Musterlösung: -[pr2.lambda.mogrifier_2](../../solutions/src/main/java/pr2/lambda/mogrifier_2/) +[pr2.collections.list_iterator](../../solutions/src/main/java/pr2/collections/list_iterator/) diff --git a/Assignment_082/kafka.txt b/Assignment_082/kafka.txt new file mode 100644 index 0000000..b5695c5 --- /dev/null +++ b/Assignment_082/kafka.txt @@ -0,0 +1,11 @@ +Verhaftung - Gespräch mit Frau Grubach - Dann Fräulein Bürstner + +Jemand mußte Josef K. verleumdet haben, denn ohne daß er etwas Böses getan hätte, wurde er eines Morgens verhaftet. Die Köchin der Frau Grubach, seiner Zimmervermieterin, die ihm jeden Tag gegen acht Uhr früh das Frühstück brachte, kam diesmal nicht. Das war noch niemals geschehen. K. wartete noch ein Weilchen, sah von seinem Kopfkissen aus die alte Frau, die ihm gegenüber wohnte und die ihn mit einer an ihr ganz ungewöhnlichen Neugierde beobachtete, dann aber, gleichzeitig befremdet und hungrig, läutete er. Sofort klopfte es und ein Mann, den er in dieser Wohnung noch niemals gesehen hatte, trat ein. Er war schlank und doch fest gebaut, er trug ein anliegendes schwarzes Kleid, das, ähnlich den Reiseanzügen, mit verschiedenen Falten, Taschen, Schnallen, Knöpfen und einem Gürtel versehen war und infolgedessen, ohne daß man sich darüber klar wurde, wozu es dienen sollte, besonders praktisch erschien. "Wer sind Sie?" fragte K. und saß gleich halb aufrecht im Bett. Der Mann aber ging über die Frage hinweg, als müsse man seine Erscheinung hinnehmen, und sagte bloß seinerseits: "Sie haben geläutet?" "Anna soll mir das Frühstück bringen", sagte K. und versuchte, zunächst stillschweigend, durch Aufmerksamkeit und Überlegung festzustellen, wer der Mann eigentlich war. Aber dieser setzte sich nicht allzulange seinen Blicken aus, sondern wandte sich zur Tür, die er ein wenig öffnete, um jemandem, der offenbar knapp hinter der Tür stand, zu sagen: "Er will, daß Anna ihm das Frühstück bringt." Ein kleines Gelächter im Nebenzimmer folgte, es war nach dem Klang nicht sicher, ob nicht mehrere Personen daran beteiligt waren. Obwohl der fremde Mann dadurch nichts erfahren haben konnte, was er nicht schon früher gewußt hätte, sagte er nun doch zu K. im Tone einer Meldung: "Es ist unmöglich." "Das wäre neu", sagte K., sprang aus dem Bett und zog rasch seine Hosen an. "Ich will doch sehen, was für Leute im Nebenzimmer sind und wie Frau Grubach diese Störung mir gegenüber verantworten wird." Es fiel ihm zwar gleich ein, daß er das nicht hätte laut sagen müssen und daß er dadurch gewissermaßen ein Beaufsichtigungsrecht des Fremden anerkannte, aber es schien ihm jetzt nicht wichtig. Immerhin faßte es der Fremde so auf, denn er sagte: "Wollen Sie nicht lieber hierbleiben?" "Ich will weder hierbleiben, noch von Ihnen angesprochen werden, solange Sie sich mir nicht vorstellen." "Es war gut gemeint", sagte der Fremde und öffnete nun freiwillig die Tür. Im Nebenzimmer, in das K. langsamer eintrat, als er wollte, sah es auf den ersten Blick fast genau so aus wie am Abend vorher. Es war das Wohnzimmer der Frau Grubach, vielleicht war in diesem mit Möbeln, Decken, Porzellan und Photographien überfüllten Zimmer heute ein wenig mehr Raum als sonst, man erkannte das nicht gleich, um so weniger, als die Hauptveränderung in der Anwesenheit eines Mannes bestand, der beim offenen Fenster mit einem Buch saß, von dem er jetzt aufblickte. "Sie hätten in Ihrem Zimmer bleiben sollen! Hat es Ihnen denn Franz nicht gesagt?" "Ja, was wollen Sie denn?" sagte K. und sah von der neuen Bekanntschaft zu dem mit Franz Benannten, der in der Tür stehengeblieben war, und dann wieder zurück. Durch das offene Fenster erblickte man wieder die alte Frau, die mit wahrhaft greisenhafter Neugierde zu dem jetzt gegenüberliegenden Fenster getreten war, um auch weiterhin alles zu sehen. "Ich will doch Frau Grubach -", sagte K., machte eine Bewegung, als reiße er sich von den zwei Männern los, die aber weit von ihm entfernt standen, und wollte weitergehen. "Nein", sagte der Mann beim Fenster, warf das Buch auf ein Tischchen und stand auf. "Sie dürfen nicht weggehen, Sie sind ja verhaftet." "Es sieht so aus", sagte K. "Und warum denn?" fragte er dann. "Wir sind nicht dazu bestellt, Ihnen das zu sagen. Gehen Sie in Ihr Zimmer und warten Sie. Das Verfahren ist nun einmal eingeleitet, und Sie werden alles zur richtigen Zeit erfahren. Ich gehe über meinen Auftrag hinaus, wenn ich Ihnen so freundschaftlich zurede. Aber ich hoffe, es hört es niemand sonst als Franz, und der ist selbst gegen alle Vorschrift freundlich zu Ihnen. Wenn Sie auch weiterhin so viel Glück haben wie bei der Bestimmung Ihrer Wächter, dann können Sie zuversichtlich sein." K. wollte sich setzen, aber nun sah er, daß im ganzen Zimmer keine Sitzgelegenheit war, außer dem Sessel beim Fenster. "Sie werden noch einsehen, wie wahr das alles ist", sagte Franz und ging gleichzeitig mit dem andern Mann auf ihn zu. Besonders der letztere überragte K. bedeutend und klopfte ihm öfters auf die Schulter. Beide prüften K.s Nachthemd und sagten, daß er jetzt ein viel schlechteres Hemd werde anziehen müssen, daß sie aber dieses Hemd wie auch seine übrige Wäsche aufbewahren und, wenn seine Sache günstig ausfallen sollte, ihm wieder zurückgeben würden. "Es ist besser, Sie geben die Sachen uns als ins Depot", sagten sie, "denn im Depot kommen öfters Unterschleife vor und außerdem verkauft man dort alle Sachen nach einer gewissen Zeit, ohne Rücksicht, ob das betreffende Verfahren zu Ende ist oder nicht. Und wie lange dauern doch derartige Prozesse, besonders in letzter Zeit! Sie bekämen dann schließlich allerdings vom Depot den Erlös, aber dieser Erlös ist erstens an sich schon gering, denn beim Verkauf entscheidet nicht die Höhe des Angebotes, sondern die Höhe der Bestechung, und weiter verringern sich solche Erlöse erfahrungsgemäß, wenn sie von Hand zu Hand und von Jahr zu Jahr weitergegeben werden." K. achtete auf diese Reden kaum, das Verfügungsrecht über seine Sachen, das er vielleicht noch besaß, schätzte er nicht hoch ein, viel wichtiger war es ihm, Klarheit über seine Lage zu bekommen; in Gegenwart dieser Leute konnte er aber nicht einmal nachdenken, immer wieder stieß der Bauch des zweiten Wächters - es konnten ja nur Wächter sein - förmlich freundschaftlich an ihn, sah er aber auf, dann erblickte er ein zu diesem dicken Körper gar nicht passendes trockenes, knochiges Gesicht mit starker, seitlich gedrehter Nase, das sich über ihn hinweg mit dem anderen Wächter verständigte. Was waren denn das für Menschen? Wovon sprachen sie? Welcher Behörde gehörten sie an? K. lebte doch in einem Rechtsstaat, überall herrschte Friede, alle Gesetze bestanden aufrecht, wer wagte, ihn in seiner Wohnung zu überfallen? Er neigte stets dazu, alles möglichst leicht zu nehmen, das Schlimmste erst beim Eintritt des Schlimmsten zu glauben, keine Vorsorge für die Zukunft zu treffen, selbst wenn alles drohte. Hier schien ihm das aber nicht richtig, man konnte zwar das Ganze als Spaß ansehen, als einen groben Spaß, den ihm aus unbekannten Gründen, vielleicht weil heute sein dreißigster Geburtstag war, die Kollegen in der Bank veranstaltet hatten, es war natürlich möglich, vielleicht brauchte er nur auf irgendeine Weise den Wächtern ins Gesicht zu lachen, und sie würden mitlachen, vielleicht waren es Dienstmänner von der Straßenecke, sie sahen ihnen nicht unähnlich - trotzdem war er diesmal, förmlich schon seit dem ersten Anblick des Wächters Franz, entschlossen, nicht den geringsten Vorteil, den er vielleicht gegenüber diesen Leuten besaß, aus der Hand zu geben. Darin, daß man später sagen würde, er habe keinen Spaß verstanden, sah K. eine ganz geringe Gefahr, wohl aber erinnerte er sich - ohne daß es sonst seine Gewohnheit gewesen wäre, aus Erfahrungen zu lernen - an einige, an sich unbedeutende Fälle, in denen er zum Unterschied von seinen Freunden mit Bewußtsein, ohne das geringste Gefühl für die möglichen Folgen, sich unvorsichtig benommen hatte und dafür durch das Ergebnis gestraft worden war. Es sollte nicht wieder geschehen, zumindest nicht diesmal; war es eine Komödie, so wollte er mitspielen. + +Noch war er frei. "Erlauben Sie", sagte er und ging eilig zwischen den Wächtern durch in sein Zimmer. "Er scheint vernünftig zu sein", hörte er hinter sich sagen. In seinem Zimmer riß er gleich die Schubladen des Schreibtischs auf, es lag dort alles in großer Ordnung, aber gerade die Legitimationspapiere, die er suchte, konnte er in der Aufregung nicht gleich finden. Schließlich fand er seine Radfahrlegitimation und wollte schon mit ihr zu den Wächtern gehen, dann aber schien ihm das Papier zu geringfügig und er suchte weiter, bis er den Geburtsschein fand. Als er wieder in das Nebenzimmer zurückkam, öffnete sich gerade die gegenüberliegende Tür und Frau Grubach wollte dort eintreten. Man sah sie nur einen Augenblick, denn kaum hatte sie K. erkannt, als sie offenbar verlegen wurde, um Verzeihung bat, verschwand und äußerst vorsichtig die Tür schloß. "Kommen Sie doch herein", hatte K. gerade noch sagen können. Nun aber stand er mit seinen Papieren in der Mitte des Zimmers, sah noch auf die Tür hin, die sich nicht wieder öffnete, und wurde erst durch einen Anruf der Wächter aufgeschreckt, die bei dem Tischchen am offenen Fenster saßen und, wie K. jetzt erkannte, sein Frühstück verzehrten. "Warum ist sie nicht eingetreten?" fragte er. "Sie darf nicht", sagte der große Wächter. "Sie sind doch verhaftet." "Wie kann ich denn verhaftet sein? Und gar auf diese Weise?" "Nun fangen Sie also wieder an", sagte der Wächter und tauchte ein Butterbrot ins Honigfäßchen. "Solche Fragen beantworten wir nicht." "Sie werden sie beantworten müssen", sagte K. "Hier sind meine Legitimationspapiere, zeigen Sie mir jetzt die Ihrigen und vor allem den Verhaftbefehl." "Du lieber Himmel!" sagte der Wächter. "Daß Sie sich in Ihre Lage nicht fügen können und daß Sie es darauf angelegt zu haben scheinen, uns, die wir Ihnen jetzt wahrscheinlich von allen Ihren Mitmenschen am nächsten stehen, nutzlos zu reizen!" "Es ist so, glauben Sie es doch", sagte Franz, führte die Kaffeetasse, die er in der Hand hielt, nicht zum Mund, sondern sah K. mit einem langen, wahrscheinlich bedeutungsvollen, aber unverständlichen Blick an. K. ließ sich, ohne es zu wollen, in ein Zwiegespräch der Blicke mit Franz ein, schlug dann aber doch auf seine Papiere und sagte: "Hier sind meine Legitimationspapiere." "Was kümmern uns denn die?" rief nun schon der große Wächter. "Sie führen sich ärger auf als ein Kind. Was wollen Sie denn? Wollen Sie Ihren großen, verfluchten Prozeß dadurch zu einem raschen Ende bringen, daß Sie mit uns, den Wächtern, über Legitimation und Verhaftbefehl diskutieren? Wir sind niedrige Angestellte, die sich in einem Legitimationspapier kaum auskennen und die mit Ihrer Sache nichts anderes zu tun haben, als daß sie zehn Stunden täglich bei Ihnen Wache halten und dafür bezahlt werden. Das ist alles, was wir sind, trotzdem aber sind wir fähig, einzusehen, daß die hohen Behörden, in deren Dienst wir stehen, ehe sie eine solche Verhaftung verfügen, sich sehr genau über die Gründe der Verhaftung und die Person des Verhafteten unterrichten. Es gibt darin keinen Irrtum. Unsere Behörde, soweit ich sie kenne, und ich kenne nur die niedrigsten Grade, sucht doch nicht etwa die Schuld in der Bevölkerung, sondern wird, wie es im Gesetz heißt, von der Schuld angezogen und muß uns Wächter ausschicken. Das ist Gesetz. Wo gäbe es da einen Irrtum?" "Dieses Gesetz kenne ich nicht", sagte K. "Desto schlimmer für Sie", sagte der Wächter. "Es besteht wohl auch nur in Ihren Köpfen", sagte K., er wollte sich irgendwie in die Gedanken der Wächter einschleichen, sie zu seinen Gunsten wenden oder sich dort einbürgern. Aber der Wächter sagte nur abweisend: "Sie werden es zu fühlen bekommen." Franz mischte sich ein und sagte: "Sieh, Willem, er gibt zu, er kenne das Gesetz nicht, und behauptet gleichzeitig, schuldlos zu sein." "Du hast ganz recht, aber ihm kann man nichts begreiflich machen", sagte der andere. K. antwortete nichts mehr; muß ich, dachte er, durch das Geschwätz dieser niedrigsten Organe - sie geben selbst zu, es zu sein - mich noch mehr verwirren lassen? Sie reden doch jedenfalls von Dingen, die sie gar nicht verstehen. Ihre Sicherheit ist nur durch ihre Dummheit möglich. Ein paar Worte, die ich mit einem mir ebenbürtigen Menschen sprechen werde, werden alles unvergleichlich klarer machen als die längsten Reden mit diesen. Er ging einige Male in dem freien Raum des Zimmers auf und ab, drüben sah er die alte Frau, die einen noch viel älteren Greis zum Fenster gezerrt hatte, den sie umschlungen hielt. K. mußte dieser Schaustellung ein Ende machen: "Führen Sie mich zu Ihrem Vorgesetzten", sagte er. "Wenn er es wünscht; nicht früher", sagte der Wächter, der Willem genannt worden war. "Und nun rate ich Ihnen", fügte er hinzu, "in Ihr Zimmer zu gehen, sich ruhig zu verhalten und darauf zu warten, was über Sie verfügt werden wird. Wir raten Ihnen, zerstreuen Sie sich nicht durch nutzlose Gedanken, sondern sammeln Sie sich, es werden große Anforderungen an Sie gestellt werden. Sie haben uns nicht so behandelt, wie es unser Entgegenkommen verdient hätte, Sie haben vergessen, daß wir, mögen wir auch sein was immer, zumindest jetzt Ihnen gegenüber freie Männer sind, das ist kein kleines Übergewicht. Trotzdem sind wir bereit, falls Sie Geld haben, Ihnen ein kleines Frühstück aus dem Kaffeehaus drüben zu bringen." + +Ohne auf dieses Angebot zu antworten, stand K. ein Weilchen lang still. Vielleicht würden ihn die beiden, wenn er die Tür des folgenden Zimmers oder gar die Tür des Vorzimmers öffnete, gar nicht zu hindern wagen, vielleicht wäre es die einfachste Lösung des Ganzen, daß er es auf die Spitze trieb. Aber vielleicht würden sie ihn doch packen und, war er einmal niedergeworfen, so war auch alle Überlegenheit verloren, die er jetzt ihnen gegenüber in gewisser Hinsicht doch wahrte. Deshalb zog er die Sicherheit der Lösung vor, wie sie der natürliche Verlauf bringen mußte, und ging in sein Zimmer zurück, ohne daß von seiner Seite oder von Seite der Wächter ein weiteres Wort gefallen wäre. + +Er warf sich auf sein Bett und nahm vom Waschtisch einen schönen Apfel, den er sich gestern abend für das Frühstück vorbereitet hatte. Jetzt war er sein einziges Frühstück und jedenfalls, wie er sich beim ersten großen Bissen versicherte, viel besser, als das Frühstück aus dem schmutzigen Nachtcafé gewesen wäre, das er durch die Gnade der Wächter hätte bekommen können. Er fühlte sich wohl und zuversichtlich, in der Bank versäumte er zwar heute vormittag seinen Dienst, aber das war bei der verhältnismäßig hohen Stellung, die er dort einnahm, leicht entschuldigt. Sollte er die wirkliche Entschuldigung anführen? Er gedachte es zu tun, Würde man ihm nicht glauben, was in diesem Fall begreiflich war, so konnte er Frau Grubach als Zeugin führen oder auch die beiden Alten von drüben, die wohl jetzt auf dem Marsch zum gegenüberliegenden Fenster waren. Es wunderte K., wenigstens aus dem Gedankengang der Wächter wunderte es ihn, daß sie ihn in das Zimmer getrieben und ihn hier allein gelassen hatten, wo er doch zehnfache Möglichkeit hatte, sich umzubringen. Gleichzeitig allerdings fragte er sich, diesmal aus seinem Gedankengang, was für einen Grund er haben könnte, es zu tun. Etwa weil die zwei nebenan saßen und sein Frühstück abgefangen hatten? Es wäre so sinnlos gewesen, sich umzubringen, daß er, selbst wenn er es hätte tun wollen, infolge der Sinnlosigkeit dazu nicht imstande gewesen wäre. Wäre die geistige Beschränktheit der Wächter nicht so auffallend gewesen, so hätte man annehmen können, daß auch sie, infolge der gleichen Überzeugung, keine Gefahr darin gesehen hätten, ihn allein zu lassen. Sie mochten jetzt, wenn sie wollten, zusehen, wie er zu einem Wandschränkchen ging, in dem er einen guten Schnaps aufbewahrte, wie er ein Gläschen zuerst zum Ersatz des Frühstücks leerte und wie er ein zweites Gläschen dazu bestimmte, sich Mut zu machen, das letztere nur aus Vorsicht für den unwahrscheinlichen Fall, daß es nötig sein sollte. + + diff --git a/Assignment_082/readme.md b/Assignment_082/readme.md index f8d84fc..89871d3 100644 --- a/Assignment_082/readme.md +++ b/Assignment_082/readme.md @@ -1,20 +1,26 @@ -# Static Member Class +# `List` und dessen Implementierungen [Musterlösung](solution/) ## Lernziel -Eine Klasse als statische Elementklasse realisieren. +Das Interface `List` und eine passende Implementierung einsetzen. ## Aufgabe -Gehen Sie in das Paket [pr2.lambda.static_member](../sources/src/main/java/pr2/lambda/static_member/). +Gehen Sie in das Paket [pr2.collections.list](../sources/src/main/java/pr2/collections/list/). -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.) +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. -Ihre Aufgabe besteht nun darin, die Klasse `Alien` zu einer statischen Elementklasse der Klasse `GameBoard` zu machen. +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 das Programm nach der Änderung wieder laufen und schauen überprüfen Sie, dass es sich noch korrekt verhält. +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` und deren Implementierungen verwendet werden. Ändern Sie die Schnittstellen und Parameter der Methoden von `String[]` auf `List`. 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. + +Die Datei mit dem Text finden Sie unter [kafka.txt](../sources/src/main/resources/pr2/collections/list/kafka.txt). ## Abgabe (optional) diff --git a/Assignment_082/solution/readme.md b/Assignment_082/solution/readme.md index 75f6291..6157b4c 100644 --- a/Assignment_082/solution/readme.md +++ b/Assignment_082/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Static Member Class +# Lösung: `List` und dessen Implementierungen Musterlösung: -[pr2.lambda.static_member](../../solutions/src/main/java/pr2/lambda/static_member/) +[pr2.collections.list](../../solutions/src/main/java/pr2/collections/list/) diff --git a/Assignment_083/kafka.txt b/Assignment_083/kafka.txt new file mode 100644 index 0000000..b5695c5 --- /dev/null +++ b/Assignment_083/kafka.txt @@ -0,0 +1,11 @@ +Verhaftung - Gespräch mit Frau Grubach - Dann Fräulein Bürstner + +Jemand mußte Josef K. verleumdet haben, denn ohne daß er etwas Böses getan hätte, wurde er eines Morgens verhaftet. Die Köchin der Frau Grubach, seiner Zimmervermieterin, die ihm jeden Tag gegen acht Uhr früh das Frühstück brachte, kam diesmal nicht. Das war noch niemals geschehen. K. wartete noch ein Weilchen, sah von seinem Kopfkissen aus die alte Frau, die ihm gegenüber wohnte und die ihn mit einer an ihr ganz ungewöhnlichen Neugierde beobachtete, dann aber, gleichzeitig befremdet und hungrig, läutete er. Sofort klopfte es und ein Mann, den er in dieser Wohnung noch niemals gesehen hatte, trat ein. Er war schlank und doch fest gebaut, er trug ein anliegendes schwarzes Kleid, das, ähnlich den Reiseanzügen, mit verschiedenen Falten, Taschen, Schnallen, Knöpfen und einem Gürtel versehen war und infolgedessen, ohne daß man sich darüber klar wurde, wozu es dienen sollte, besonders praktisch erschien. "Wer sind Sie?" fragte K. und saß gleich halb aufrecht im Bett. Der Mann aber ging über die Frage hinweg, als müsse man seine Erscheinung hinnehmen, und sagte bloß seinerseits: "Sie haben geläutet?" "Anna soll mir das Frühstück bringen", sagte K. und versuchte, zunächst stillschweigend, durch Aufmerksamkeit und Überlegung festzustellen, wer der Mann eigentlich war. Aber dieser setzte sich nicht allzulange seinen Blicken aus, sondern wandte sich zur Tür, die er ein wenig öffnete, um jemandem, der offenbar knapp hinter der Tür stand, zu sagen: "Er will, daß Anna ihm das Frühstück bringt." Ein kleines Gelächter im Nebenzimmer folgte, es war nach dem Klang nicht sicher, ob nicht mehrere Personen daran beteiligt waren. Obwohl der fremde Mann dadurch nichts erfahren haben konnte, was er nicht schon früher gewußt hätte, sagte er nun doch zu K. im Tone einer Meldung: "Es ist unmöglich." "Das wäre neu", sagte K., sprang aus dem Bett und zog rasch seine Hosen an. "Ich will doch sehen, was für Leute im Nebenzimmer sind und wie Frau Grubach diese Störung mir gegenüber verantworten wird." Es fiel ihm zwar gleich ein, daß er das nicht hätte laut sagen müssen und daß er dadurch gewissermaßen ein Beaufsichtigungsrecht des Fremden anerkannte, aber es schien ihm jetzt nicht wichtig. Immerhin faßte es der Fremde so auf, denn er sagte: "Wollen Sie nicht lieber hierbleiben?" "Ich will weder hierbleiben, noch von Ihnen angesprochen werden, solange Sie sich mir nicht vorstellen." "Es war gut gemeint", sagte der Fremde und öffnete nun freiwillig die Tür. Im Nebenzimmer, in das K. langsamer eintrat, als er wollte, sah es auf den ersten Blick fast genau so aus wie am Abend vorher. Es war das Wohnzimmer der Frau Grubach, vielleicht war in diesem mit Möbeln, Decken, Porzellan und Photographien überfüllten Zimmer heute ein wenig mehr Raum als sonst, man erkannte das nicht gleich, um so weniger, als die Hauptveränderung in der Anwesenheit eines Mannes bestand, der beim offenen Fenster mit einem Buch saß, von dem er jetzt aufblickte. "Sie hätten in Ihrem Zimmer bleiben sollen! Hat es Ihnen denn Franz nicht gesagt?" "Ja, was wollen Sie denn?" sagte K. und sah von der neuen Bekanntschaft zu dem mit Franz Benannten, der in der Tür stehengeblieben war, und dann wieder zurück. Durch das offene Fenster erblickte man wieder die alte Frau, die mit wahrhaft greisenhafter Neugierde zu dem jetzt gegenüberliegenden Fenster getreten war, um auch weiterhin alles zu sehen. "Ich will doch Frau Grubach -", sagte K., machte eine Bewegung, als reiße er sich von den zwei Männern los, die aber weit von ihm entfernt standen, und wollte weitergehen. "Nein", sagte der Mann beim Fenster, warf das Buch auf ein Tischchen und stand auf. "Sie dürfen nicht weggehen, Sie sind ja verhaftet." "Es sieht so aus", sagte K. "Und warum denn?" fragte er dann. "Wir sind nicht dazu bestellt, Ihnen das zu sagen. Gehen Sie in Ihr Zimmer und warten Sie. Das Verfahren ist nun einmal eingeleitet, und Sie werden alles zur richtigen Zeit erfahren. Ich gehe über meinen Auftrag hinaus, wenn ich Ihnen so freundschaftlich zurede. Aber ich hoffe, es hört es niemand sonst als Franz, und der ist selbst gegen alle Vorschrift freundlich zu Ihnen. Wenn Sie auch weiterhin so viel Glück haben wie bei der Bestimmung Ihrer Wächter, dann können Sie zuversichtlich sein." K. wollte sich setzen, aber nun sah er, daß im ganzen Zimmer keine Sitzgelegenheit war, außer dem Sessel beim Fenster. "Sie werden noch einsehen, wie wahr das alles ist", sagte Franz und ging gleichzeitig mit dem andern Mann auf ihn zu. Besonders der letztere überragte K. bedeutend und klopfte ihm öfters auf die Schulter. Beide prüften K.s Nachthemd und sagten, daß er jetzt ein viel schlechteres Hemd werde anziehen müssen, daß sie aber dieses Hemd wie auch seine übrige Wäsche aufbewahren und, wenn seine Sache günstig ausfallen sollte, ihm wieder zurückgeben würden. "Es ist besser, Sie geben die Sachen uns als ins Depot", sagten sie, "denn im Depot kommen öfters Unterschleife vor und außerdem verkauft man dort alle Sachen nach einer gewissen Zeit, ohne Rücksicht, ob das betreffende Verfahren zu Ende ist oder nicht. Und wie lange dauern doch derartige Prozesse, besonders in letzter Zeit! Sie bekämen dann schließlich allerdings vom Depot den Erlös, aber dieser Erlös ist erstens an sich schon gering, denn beim Verkauf entscheidet nicht die Höhe des Angebotes, sondern die Höhe der Bestechung, und weiter verringern sich solche Erlöse erfahrungsgemäß, wenn sie von Hand zu Hand und von Jahr zu Jahr weitergegeben werden." K. achtete auf diese Reden kaum, das Verfügungsrecht über seine Sachen, das er vielleicht noch besaß, schätzte er nicht hoch ein, viel wichtiger war es ihm, Klarheit über seine Lage zu bekommen; in Gegenwart dieser Leute konnte er aber nicht einmal nachdenken, immer wieder stieß der Bauch des zweiten Wächters - es konnten ja nur Wächter sein - förmlich freundschaftlich an ihn, sah er aber auf, dann erblickte er ein zu diesem dicken Körper gar nicht passendes trockenes, knochiges Gesicht mit starker, seitlich gedrehter Nase, das sich über ihn hinweg mit dem anderen Wächter verständigte. Was waren denn das für Menschen? Wovon sprachen sie? Welcher Behörde gehörten sie an? K. lebte doch in einem Rechtsstaat, überall herrschte Friede, alle Gesetze bestanden aufrecht, wer wagte, ihn in seiner Wohnung zu überfallen? Er neigte stets dazu, alles möglichst leicht zu nehmen, das Schlimmste erst beim Eintritt des Schlimmsten zu glauben, keine Vorsorge für die Zukunft zu treffen, selbst wenn alles drohte. Hier schien ihm das aber nicht richtig, man konnte zwar das Ganze als Spaß ansehen, als einen groben Spaß, den ihm aus unbekannten Gründen, vielleicht weil heute sein dreißigster Geburtstag war, die Kollegen in der Bank veranstaltet hatten, es war natürlich möglich, vielleicht brauchte er nur auf irgendeine Weise den Wächtern ins Gesicht zu lachen, und sie würden mitlachen, vielleicht waren es Dienstmänner von der Straßenecke, sie sahen ihnen nicht unähnlich - trotzdem war er diesmal, förmlich schon seit dem ersten Anblick des Wächters Franz, entschlossen, nicht den geringsten Vorteil, den er vielleicht gegenüber diesen Leuten besaß, aus der Hand zu geben. Darin, daß man später sagen würde, er habe keinen Spaß verstanden, sah K. eine ganz geringe Gefahr, wohl aber erinnerte er sich - ohne daß es sonst seine Gewohnheit gewesen wäre, aus Erfahrungen zu lernen - an einige, an sich unbedeutende Fälle, in denen er zum Unterschied von seinen Freunden mit Bewußtsein, ohne das geringste Gefühl für die möglichen Folgen, sich unvorsichtig benommen hatte und dafür durch das Ergebnis gestraft worden war. Es sollte nicht wieder geschehen, zumindest nicht diesmal; war es eine Komödie, so wollte er mitspielen. + +Noch war er frei. "Erlauben Sie", sagte er und ging eilig zwischen den Wächtern durch in sein Zimmer. "Er scheint vernünftig zu sein", hörte er hinter sich sagen. In seinem Zimmer riß er gleich die Schubladen des Schreibtischs auf, es lag dort alles in großer Ordnung, aber gerade die Legitimationspapiere, die er suchte, konnte er in der Aufregung nicht gleich finden. Schließlich fand er seine Radfahrlegitimation und wollte schon mit ihr zu den Wächtern gehen, dann aber schien ihm das Papier zu geringfügig und er suchte weiter, bis er den Geburtsschein fand. Als er wieder in das Nebenzimmer zurückkam, öffnete sich gerade die gegenüberliegende Tür und Frau Grubach wollte dort eintreten. Man sah sie nur einen Augenblick, denn kaum hatte sie K. erkannt, als sie offenbar verlegen wurde, um Verzeihung bat, verschwand und äußerst vorsichtig die Tür schloß. "Kommen Sie doch herein", hatte K. gerade noch sagen können. Nun aber stand er mit seinen Papieren in der Mitte des Zimmers, sah noch auf die Tür hin, die sich nicht wieder öffnete, und wurde erst durch einen Anruf der Wächter aufgeschreckt, die bei dem Tischchen am offenen Fenster saßen und, wie K. jetzt erkannte, sein Frühstück verzehrten. "Warum ist sie nicht eingetreten?" fragte er. "Sie darf nicht", sagte der große Wächter. "Sie sind doch verhaftet." "Wie kann ich denn verhaftet sein? Und gar auf diese Weise?" "Nun fangen Sie also wieder an", sagte der Wächter und tauchte ein Butterbrot ins Honigfäßchen. "Solche Fragen beantworten wir nicht." "Sie werden sie beantworten müssen", sagte K. "Hier sind meine Legitimationspapiere, zeigen Sie mir jetzt die Ihrigen und vor allem den Verhaftbefehl." "Du lieber Himmel!" sagte der Wächter. "Daß Sie sich in Ihre Lage nicht fügen können und daß Sie es darauf angelegt zu haben scheinen, uns, die wir Ihnen jetzt wahrscheinlich von allen Ihren Mitmenschen am nächsten stehen, nutzlos zu reizen!" "Es ist so, glauben Sie es doch", sagte Franz, führte die Kaffeetasse, die er in der Hand hielt, nicht zum Mund, sondern sah K. mit einem langen, wahrscheinlich bedeutungsvollen, aber unverständlichen Blick an. K. ließ sich, ohne es zu wollen, in ein Zwiegespräch der Blicke mit Franz ein, schlug dann aber doch auf seine Papiere und sagte: "Hier sind meine Legitimationspapiere." "Was kümmern uns denn die?" rief nun schon der große Wächter. "Sie führen sich ärger auf als ein Kind. Was wollen Sie denn? Wollen Sie Ihren großen, verfluchten Prozeß dadurch zu einem raschen Ende bringen, daß Sie mit uns, den Wächtern, über Legitimation und Verhaftbefehl diskutieren? Wir sind niedrige Angestellte, die sich in einem Legitimationspapier kaum auskennen und die mit Ihrer Sache nichts anderes zu tun haben, als daß sie zehn Stunden täglich bei Ihnen Wache halten und dafür bezahlt werden. Das ist alles, was wir sind, trotzdem aber sind wir fähig, einzusehen, daß die hohen Behörden, in deren Dienst wir stehen, ehe sie eine solche Verhaftung verfügen, sich sehr genau über die Gründe der Verhaftung und die Person des Verhafteten unterrichten. Es gibt darin keinen Irrtum. Unsere Behörde, soweit ich sie kenne, und ich kenne nur die niedrigsten Grade, sucht doch nicht etwa die Schuld in der Bevölkerung, sondern wird, wie es im Gesetz heißt, von der Schuld angezogen und muß uns Wächter ausschicken. Das ist Gesetz. Wo gäbe es da einen Irrtum?" "Dieses Gesetz kenne ich nicht", sagte K. "Desto schlimmer für Sie", sagte der Wächter. "Es besteht wohl auch nur in Ihren Köpfen", sagte K., er wollte sich irgendwie in die Gedanken der Wächter einschleichen, sie zu seinen Gunsten wenden oder sich dort einbürgern. Aber der Wächter sagte nur abweisend: "Sie werden es zu fühlen bekommen." Franz mischte sich ein und sagte: "Sieh, Willem, er gibt zu, er kenne das Gesetz nicht, und behauptet gleichzeitig, schuldlos zu sein." "Du hast ganz recht, aber ihm kann man nichts begreiflich machen", sagte der andere. K. antwortete nichts mehr; muß ich, dachte er, durch das Geschwätz dieser niedrigsten Organe - sie geben selbst zu, es zu sein - mich noch mehr verwirren lassen? Sie reden doch jedenfalls von Dingen, die sie gar nicht verstehen. Ihre Sicherheit ist nur durch ihre Dummheit möglich. Ein paar Worte, die ich mit einem mir ebenbürtigen Menschen sprechen werde, werden alles unvergleichlich klarer machen als die längsten Reden mit diesen. Er ging einige Male in dem freien Raum des Zimmers auf und ab, drüben sah er die alte Frau, die einen noch viel älteren Greis zum Fenster gezerrt hatte, den sie umschlungen hielt. K. mußte dieser Schaustellung ein Ende machen: "Führen Sie mich zu Ihrem Vorgesetzten", sagte er. "Wenn er es wünscht; nicht früher", sagte der Wächter, der Willem genannt worden war. "Und nun rate ich Ihnen", fügte er hinzu, "in Ihr Zimmer zu gehen, sich ruhig zu verhalten und darauf zu warten, was über Sie verfügt werden wird. Wir raten Ihnen, zerstreuen Sie sich nicht durch nutzlose Gedanken, sondern sammeln Sie sich, es werden große Anforderungen an Sie gestellt werden. Sie haben uns nicht so behandelt, wie es unser Entgegenkommen verdient hätte, Sie haben vergessen, daß wir, mögen wir auch sein was immer, zumindest jetzt Ihnen gegenüber freie Männer sind, das ist kein kleines Übergewicht. Trotzdem sind wir bereit, falls Sie Geld haben, Ihnen ein kleines Frühstück aus dem Kaffeehaus drüben zu bringen." + +Ohne auf dieses Angebot zu antworten, stand K. ein Weilchen lang still. Vielleicht würden ihn die beiden, wenn er die Tür des folgenden Zimmers oder gar die Tür des Vorzimmers öffnete, gar nicht zu hindern wagen, vielleicht wäre es die einfachste Lösung des Ganzen, daß er es auf die Spitze trieb. Aber vielleicht würden sie ihn doch packen und, war er einmal niedergeworfen, so war auch alle Überlegenheit verloren, die er jetzt ihnen gegenüber in gewisser Hinsicht doch wahrte. Deshalb zog er die Sicherheit der Lösung vor, wie sie der natürliche Verlauf bringen mußte, und ging in sein Zimmer zurück, ohne daß von seiner Seite oder von Seite der Wächter ein weiteres Wort gefallen wäre. + +Er warf sich auf sein Bett und nahm vom Waschtisch einen schönen Apfel, den er sich gestern abend für das Frühstück vorbereitet hatte. Jetzt war er sein einziges Frühstück und jedenfalls, wie er sich beim ersten großen Bissen versicherte, viel besser, als das Frühstück aus dem schmutzigen Nachtcafé gewesen wäre, das er durch die Gnade der Wächter hätte bekommen können. Er fühlte sich wohl und zuversichtlich, in der Bank versäumte er zwar heute vormittag seinen Dienst, aber das war bei der verhältnismäßig hohen Stellung, die er dort einnahm, leicht entschuldigt. Sollte er die wirkliche Entschuldigung anführen? Er gedachte es zu tun, Würde man ihm nicht glauben, was in diesem Fall begreiflich war, so konnte er Frau Grubach als Zeugin führen oder auch die beiden Alten von drüben, die wohl jetzt auf dem Marsch zum gegenüberliegenden Fenster waren. Es wunderte K., wenigstens aus dem Gedankengang der Wächter wunderte es ihn, daß sie ihn in das Zimmer getrieben und ihn hier allein gelassen hatten, wo er doch zehnfache Möglichkeit hatte, sich umzubringen. Gleichzeitig allerdings fragte er sich, diesmal aus seinem Gedankengang, was für einen Grund er haben könnte, es zu tun. Etwa weil die zwei nebenan saßen und sein Frühstück abgefangen hatten? Es wäre so sinnlos gewesen, sich umzubringen, daß er, selbst wenn er es hätte tun wollen, infolge der Sinnlosigkeit dazu nicht imstande gewesen wäre. Wäre die geistige Beschränktheit der Wächter nicht so auffallend gewesen, so hätte man annehmen können, daß auch sie, infolge der gleichen Überzeugung, keine Gefahr darin gesehen hätten, ihn allein zu lassen. Sie mochten jetzt, wenn sie wollten, zusehen, wie er zu einem Wandschränkchen ging, in dem er einen guten Schnaps aufbewahrte, wie er ein Gläschen zuerst zum Ersatz des Frühstücks leerte und wie er ein zweites Gläschen dazu bestimmte, sich Mut zu machen, das letztere nur aus Vorsicht für den unwahrscheinlichen Fall, daß es nötig sein sollte. + + diff --git a/Assignment_083/readme.md b/Assignment_083/readme.md index 3371860..9de62c8 100644 --- a/Assignment_083/readme.md +++ b/Assignment_083/readme.md @@ -1,20 +1,40 @@ -# Iterator schreiben +# `Map` verwenden [Musterlösung](solution/) ## Lernziel -Für eine gegebene Klasse einen Iterator schreiben. +Das Interface `Map` und seine Implementierungen verwenden, um Daten effizient zu verarbeiten. ## Aufgabe -Gehen Sie in das Paket [pr2.collections.iterator](../sources/src/main/java/pr2/collections/iterator/). +Gehen Sie in das Paket [pr2.collections.map](../sources/src/main/java/pr2/collections/map/). -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. +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. -Implementieren Sie in `SimpleStack` das Interface `Iterable` 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. +Betrachten Sie die Klasse `WordCount`. In dieser fehlen noch einige Elemente, damit das Programm korrekt funktionieren kann. -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. +Die innere Klasse `WordFrequency` muss das Sortieren unterstützen. Implementieren Sie daher das Interface `Comparable`. + +Fügen Sie in der Klasse `WordCount` an den durch TODO-Kommentare markierten Stellen Code hinzu, der mithilfe einer Map die Worthäufigkeiten bestimmt. + +Die Datei mit dem Text finden Sie unter [kafka.txt](../sources/src/main/resources/pr2/collections/map/kafka.txt). + +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) diff --git a/Assignment_083/solution/readme.md b/Assignment_083/solution/readme.md index 2af19d3..cd64cf7 100644 --- a/Assignment_083/solution/readme.md +++ b/Assignment_083/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Iterator schreiben +# Lösung: `Map` verwenden Musterlösung: -[pr2.collections.iterator](../../solutions/src/main/java/pr2/collections/iterator/) +[pr2.collections.map](../../solutions/src/main/java/pr2/collections/map/) diff --git a/Assignment_084/readme.md b/Assignment_084/readme.md index 1af5096..45da4e9 100644 --- a/Assignment_084/readme.md +++ b/Assignment_084/readme.md @@ -1,22 +1,18 @@ -# Mithilfe eines Iterators über Daten iterieren +# ReverserGeneric [Musterlösung](solution/) ## Lernziel -Den Iterator einer vorhandenen Klasse verwenden, um Daten auszulesen. +`Comparable` verstehen und nutzen. ## Aufgabe -Gehen Sie in das Paket [pr2.collections.iterieren](../sources/src/main/java/pr2/collections/iterieren/). +Gehen Sie in das Paket [pr2.collections.reverser_generic](../sources/src/main/java/pr2/collections/reverser_generic/). -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. +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. -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. - -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. +Testen Sie Ihre Implementierung mit der Klasse `ReverserTest`. ## Abgabe (optional) diff --git a/Assignment_084/solution/readme.md b/Assignment_084/solution/readme.md index a052299..727c05e 100644 --- a/Assignment_084/solution/readme.md +++ b/Assignment_084/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Mithilfe eines Iterators über Daten iterieren +# Lösung: ReverserGeneric Musterlösung: -[pr2.collections.iterieren](../../solutions/src/main/java/pr2/collections/iterieren/) +[pr2.collections.reverser_generic](../../solutions/src/main/java/pr2/collections/reverser_generic/) diff --git a/Assignment_085/readme.md b/Assignment_085/readme.md index 03fc5f4..6770802 100644 --- a/Assignment_085/readme.md +++ b/Assignment_085/readme.md @@ -1,16 +1,18 @@ -# Iterator programmieren +# Strings umgekehrt sortieren: Reverser [Musterlösung](solution/) ## Lernziel -Iteratoren verstehen und programmieren. +`Comparable` verstehen und nutzen. ## 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`. +Gehen Sie in das Paket [pr2.collections.reverser](../sources/src/main/java/pr2/collections/reverser/). -Geben Sie bitte den fehlenden Code für die innere Klasse `ListenIterator` an. +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. + +Testen Sie Ihre Implementierung mit der Klasse `ReverserTest`. ## Abgabe (optional) diff --git a/Assignment_085/solution/readme.md b/Assignment_085/solution/readme.md index 85889cd..297fa12 100644 --- a/Assignment_085/solution/readme.md +++ b/Assignment_085/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Iterator programmieren +# Lösung: Strings umgekehrt sortieren: Reverser Musterlösung: -[pr2.collections.list_iterator](../../solutions/src/main/java/pr2/collections/list_iterator/) +[pr2.collections.reverser](../../solutions/src/main/java/pr2/collections/reverser/) diff --git a/Assignment_086/kafka.txt b/Assignment_086/kafka.txt new file mode 100644 index 0000000..b5695c5 --- /dev/null +++ b/Assignment_086/kafka.txt @@ -0,0 +1,11 @@ +Verhaftung - Gespräch mit Frau Grubach - Dann Fräulein Bürstner + +Jemand mußte Josef K. verleumdet haben, denn ohne daß er etwas Böses getan hätte, wurde er eines Morgens verhaftet. Die Köchin der Frau Grubach, seiner Zimmervermieterin, die ihm jeden Tag gegen acht Uhr früh das Frühstück brachte, kam diesmal nicht. Das war noch niemals geschehen. K. wartete noch ein Weilchen, sah von seinem Kopfkissen aus die alte Frau, die ihm gegenüber wohnte und die ihn mit einer an ihr ganz ungewöhnlichen Neugierde beobachtete, dann aber, gleichzeitig befremdet und hungrig, läutete er. Sofort klopfte es und ein Mann, den er in dieser Wohnung noch niemals gesehen hatte, trat ein. Er war schlank und doch fest gebaut, er trug ein anliegendes schwarzes Kleid, das, ähnlich den Reiseanzügen, mit verschiedenen Falten, Taschen, Schnallen, Knöpfen und einem Gürtel versehen war und infolgedessen, ohne daß man sich darüber klar wurde, wozu es dienen sollte, besonders praktisch erschien. "Wer sind Sie?" fragte K. und saß gleich halb aufrecht im Bett. Der Mann aber ging über die Frage hinweg, als müsse man seine Erscheinung hinnehmen, und sagte bloß seinerseits: "Sie haben geläutet?" "Anna soll mir das Frühstück bringen", sagte K. und versuchte, zunächst stillschweigend, durch Aufmerksamkeit und Überlegung festzustellen, wer der Mann eigentlich war. Aber dieser setzte sich nicht allzulange seinen Blicken aus, sondern wandte sich zur Tür, die er ein wenig öffnete, um jemandem, der offenbar knapp hinter der Tür stand, zu sagen: "Er will, daß Anna ihm das Frühstück bringt." Ein kleines Gelächter im Nebenzimmer folgte, es war nach dem Klang nicht sicher, ob nicht mehrere Personen daran beteiligt waren. Obwohl der fremde Mann dadurch nichts erfahren haben konnte, was er nicht schon früher gewußt hätte, sagte er nun doch zu K. im Tone einer Meldung: "Es ist unmöglich." "Das wäre neu", sagte K., sprang aus dem Bett und zog rasch seine Hosen an. "Ich will doch sehen, was für Leute im Nebenzimmer sind und wie Frau Grubach diese Störung mir gegenüber verantworten wird." Es fiel ihm zwar gleich ein, daß er das nicht hätte laut sagen müssen und daß er dadurch gewissermaßen ein Beaufsichtigungsrecht des Fremden anerkannte, aber es schien ihm jetzt nicht wichtig. Immerhin faßte es der Fremde so auf, denn er sagte: "Wollen Sie nicht lieber hierbleiben?" "Ich will weder hierbleiben, noch von Ihnen angesprochen werden, solange Sie sich mir nicht vorstellen." "Es war gut gemeint", sagte der Fremde und öffnete nun freiwillig die Tür. Im Nebenzimmer, in das K. langsamer eintrat, als er wollte, sah es auf den ersten Blick fast genau so aus wie am Abend vorher. Es war das Wohnzimmer der Frau Grubach, vielleicht war in diesem mit Möbeln, Decken, Porzellan und Photographien überfüllten Zimmer heute ein wenig mehr Raum als sonst, man erkannte das nicht gleich, um so weniger, als die Hauptveränderung in der Anwesenheit eines Mannes bestand, der beim offenen Fenster mit einem Buch saß, von dem er jetzt aufblickte. "Sie hätten in Ihrem Zimmer bleiben sollen! Hat es Ihnen denn Franz nicht gesagt?" "Ja, was wollen Sie denn?" sagte K. und sah von der neuen Bekanntschaft zu dem mit Franz Benannten, der in der Tür stehengeblieben war, und dann wieder zurück. Durch das offene Fenster erblickte man wieder die alte Frau, die mit wahrhaft greisenhafter Neugierde zu dem jetzt gegenüberliegenden Fenster getreten war, um auch weiterhin alles zu sehen. "Ich will doch Frau Grubach -", sagte K., machte eine Bewegung, als reiße er sich von den zwei Männern los, die aber weit von ihm entfernt standen, und wollte weitergehen. "Nein", sagte der Mann beim Fenster, warf das Buch auf ein Tischchen und stand auf. "Sie dürfen nicht weggehen, Sie sind ja verhaftet." "Es sieht so aus", sagte K. "Und warum denn?" fragte er dann. "Wir sind nicht dazu bestellt, Ihnen das zu sagen. Gehen Sie in Ihr Zimmer und warten Sie. Das Verfahren ist nun einmal eingeleitet, und Sie werden alles zur richtigen Zeit erfahren. Ich gehe über meinen Auftrag hinaus, wenn ich Ihnen so freundschaftlich zurede. Aber ich hoffe, es hört es niemand sonst als Franz, und der ist selbst gegen alle Vorschrift freundlich zu Ihnen. Wenn Sie auch weiterhin so viel Glück haben wie bei der Bestimmung Ihrer Wächter, dann können Sie zuversichtlich sein." K. wollte sich setzen, aber nun sah er, daß im ganzen Zimmer keine Sitzgelegenheit war, außer dem Sessel beim Fenster. "Sie werden noch einsehen, wie wahr das alles ist", sagte Franz und ging gleichzeitig mit dem andern Mann auf ihn zu. Besonders der letztere überragte K. bedeutend und klopfte ihm öfters auf die Schulter. Beide prüften K.s Nachthemd und sagten, daß er jetzt ein viel schlechteres Hemd werde anziehen müssen, daß sie aber dieses Hemd wie auch seine übrige Wäsche aufbewahren und, wenn seine Sache günstig ausfallen sollte, ihm wieder zurückgeben würden. "Es ist besser, Sie geben die Sachen uns als ins Depot", sagten sie, "denn im Depot kommen öfters Unterschleife vor und außerdem verkauft man dort alle Sachen nach einer gewissen Zeit, ohne Rücksicht, ob das betreffende Verfahren zu Ende ist oder nicht. Und wie lange dauern doch derartige Prozesse, besonders in letzter Zeit! Sie bekämen dann schließlich allerdings vom Depot den Erlös, aber dieser Erlös ist erstens an sich schon gering, denn beim Verkauf entscheidet nicht die Höhe des Angebotes, sondern die Höhe der Bestechung, und weiter verringern sich solche Erlöse erfahrungsgemäß, wenn sie von Hand zu Hand und von Jahr zu Jahr weitergegeben werden." K. achtete auf diese Reden kaum, das Verfügungsrecht über seine Sachen, das er vielleicht noch besaß, schätzte er nicht hoch ein, viel wichtiger war es ihm, Klarheit über seine Lage zu bekommen; in Gegenwart dieser Leute konnte er aber nicht einmal nachdenken, immer wieder stieß der Bauch des zweiten Wächters - es konnten ja nur Wächter sein - förmlich freundschaftlich an ihn, sah er aber auf, dann erblickte er ein zu diesem dicken Körper gar nicht passendes trockenes, knochiges Gesicht mit starker, seitlich gedrehter Nase, das sich über ihn hinweg mit dem anderen Wächter verständigte. Was waren denn das für Menschen? Wovon sprachen sie? Welcher Behörde gehörten sie an? K. lebte doch in einem Rechtsstaat, überall herrschte Friede, alle Gesetze bestanden aufrecht, wer wagte, ihn in seiner Wohnung zu überfallen? Er neigte stets dazu, alles möglichst leicht zu nehmen, das Schlimmste erst beim Eintritt des Schlimmsten zu glauben, keine Vorsorge für die Zukunft zu treffen, selbst wenn alles drohte. Hier schien ihm das aber nicht richtig, man konnte zwar das Ganze als Spaß ansehen, als einen groben Spaß, den ihm aus unbekannten Gründen, vielleicht weil heute sein dreißigster Geburtstag war, die Kollegen in der Bank veranstaltet hatten, es war natürlich möglich, vielleicht brauchte er nur auf irgendeine Weise den Wächtern ins Gesicht zu lachen, und sie würden mitlachen, vielleicht waren es Dienstmänner von der Straßenecke, sie sahen ihnen nicht unähnlich - trotzdem war er diesmal, förmlich schon seit dem ersten Anblick des Wächters Franz, entschlossen, nicht den geringsten Vorteil, den er vielleicht gegenüber diesen Leuten besaß, aus der Hand zu geben. Darin, daß man später sagen würde, er habe keinen Spaß verstanden, sah K. eine ganz geringe Gefahr, wohl aber erinnerte er sich - ohne daß es sonst seine Gewohnheit gewesen wäre, aus Erfahrungen zu lernen - an einige, an sich unbedeutende Fälle, in denen er zum Unterschied von seinen Freunden mit Bewußtsein, ohne das geringste Gefühl für die möglichen Folgen, sich unvorsichtig benommen hatte und dafür durch das Ergebnis gestraft worden war. Es sollte nicht wieder geschehen, zumindest nicht diesmal; war es eine Komödie, so wollte er mitspielen. + +Noch war er frei. "Erlauben Sie", sagte er und ging eilig zwischen den Wächtern durch in sein Zimmer. "Er scheint vernünftig zu sein", hörte er hinter sich sagen. In seinem Zimmer riß er gleich die Schubladen des Schreibtischs auf, es lag dort alles in großer Ordnung, aber gerade die Legitimationspapiere, die er suchte, konnte er in der Aufregung nicht gleich finden. Schließlich fand er seine Radfahrlegitimation und wollte schon mit ihr zu den Wächtern gehen, dann aber schien ihm das Papier zu geringfügig und er suchte weiter, bis er den Geburtsschein fand. Als er wieder in das Nebenzimmer zurückkam, öffnete sich gerade die gegenüberliegende Tür und Frau Grubach wollte dort eintreten. Man sah sie nur einen Augenblick, denn kaum hatte sie K. erkannt, als sie offenbar verlegen wurde, um Verzeihung bat, verschwand und äußerst vorsichtig die Tür schloß. "Kommen Sie doch herein", hatte K. gerade noch sagen können. Nun aber stand er mit seinen Papieren in der Mitte des Zimmers, sah noch auf die Tür hin, die sich nicht wieder öffnete, und wurde erst durch einen Anruf der Wächter aufgeschreckt, die bei dem Tischchen am offenen Fenster saßen und, wie K. jetzt erkannte, sein Frühstück verzehrten. "Warum ist sie nicht eingetreten?" fragte er. "Sie darf nicht", sagte der große Wächter. "Sie sind doch verhaftet." "Wie kann ich denn verhaftet sein? Und gar auf diese Weise?" "Nun fangen Sie also wieder an", sagte der Wächter und tauchte ein Butterbrot ins Honigfäßchen. "Solche Fragen beantworten wir nicht." "Sie werden sie beantworten müssen", sagte K. "Hier sind meine Legitimationspapiere, zeigen Sie mir jetzt die Ihrigen und vor allem den Verhaftbefehl." "Du lieber Himmel!" sagte der Wächter. "Daß Sie sich in Ihre Lage nicht fügen können und daß Sie es darauf angelegt zu haben scheinen, uns, die wir Ihnen jetzt wahrscheinlich von allen Ihren Mitmenschen am nächsten stehen, nutzlos zu reizen!" "Es ist so, glauben Sie es doch", sagte Franz, führte die Kaffeetasse, die er in der Hand hielt, nicht zum Mund, sondern sah K. mit einem langen, wahrscheinlich bedeutungsvollen, aber unverständlichen Blick an. K. ließ sich, ohne es zu wollen, in ein Zwiegespräch der Blicke mit Franz ein, schlug dann aber doch auf seine Papiere und sagte: "Hier sind meine Legitimationspapiere." "Was kümmern uns denn die?" rief nun schon der große Wächter. "Sie führen sich ärger auf als ein Kind. Was wollen Sie denn? Wollen Sie Ihren großen, verfluchten Prozeß dadurch zu einem raschen Ende bringen, daß Sie mit uns, den Wächtern, über Legitimation und Verhaftbefehl diskutieren? Wir sind niedrige Angestellte, die sich in einem Legitimationspapier kaum auskennen und die mit Ihrer Sache nichts anderes zu tun haben, als daß sie zehn Stunden täglich bei Ihnen Wache halten und dafür bezahlt werden. Das ist alles, was wir sind, trotzdem aber sind wir fähig, einzusehen, daß die hohen Behörden, in deren Dienst wir stehen, ehe sie eine solche Verhaftung verfügen, sich sehr genau über die Gründe der Verhaftung und die Person des Verhafteten unterrichten. Es gibt darin keinen Irrtum. Unsere Behörde, soweit ich sie kenne, und ich kenne nur die niedrigsten Grade, sucht doch nicht etwa die Schuld in der Bevölkerung, sondern wird, wie es im Gesetz heißt, von der Schuld angezogen und muß uns Wächter ausschicken. Das ist Gesetz. Wo gäbe es da einen Irrtum?" "Dieses Gesetz kenne ich nicht", sagte K. "Desto schlimmer für Sie", sagte der Wächter. "Es besteht wohl auch nur in Ihren Köpfen", sagte K., er wollte sich irgendwie in die Gedanken der Wächter einschleichen, sie zu seinen Gunsten wenden oder sich dort einbürgern. Aber der Wächter sagte nur abweisend: "Sie werden es zu fühlen bekommen." Franz mischte sich ein und sagte: "Sieh, Willem, er gibt zu, er kenne das Gesetz nicht, und behauptet gleichzeitig, schuldlos zu sein." "Du hast ganz recht, aber ihm kann man nichts begreiflich machen", sagte der andere. K. antwortete nichts mehr; muß ich, dachte er, durch das Geschwätz dieser niedrigsten Organe - sie geben selbst zu, es zu sein - mich noch mehr verwirren lassen? Sie reden doch jedenfalls von Dingen, die sie gar nicht verstehen. Ihre Sicherheit ist nur durch ihre Dummheit möglich. Ein paar Worte, die ich mit einem mir ebenbürtigen Menschen sprechen werde, werden alles unvergleichlich klarer machen als die längsten Reden mit diesen. Er ging einige Male in dem freien Raum des Zimmers auf und ab, drüben sah er die alte Frau, die einen noch viel älteren Greis zum Fenster gezerrt hatte, den sie umschlungen hielt. K. mußte dieser Schaustellung ein Ende machen: "Führen Sie mich zu Ihrem Vorgesetzten", sagte er. "Wenn er es wünscht; nicht früher", sagte der Wächter, der Willem genannt worden war. "Und nun rate ich Ihnen", fügte er hinzu, "in Ihr Zimmer zu gehen, sich ruhig zu verhalten und darauf zu warten, was über Sie verfügt werden wird. Wir raten Ihnen, zerstreuen Sie sich nicht durch nutzlose Gedanken, sondern sammeln Sie sich, es werden große Anforderungen an Sie gestellt werden. Sie haben uns nicht so behandelt, wie es unser Entgegenkommen verdient hätte, Sie haben vergessen, daß wir, mögen wir auch sein was immer, zumindest jetzt Ihnen gegenüber freie Männer sind, das ist kein kleines Übergewicht. Trotzdem sind wir bereit, falls Sie Geld haben, Ihnen ein kleines Frühstück aus dem Kaffeehaus drüben zu bringen." + +Ohne auf dieses Angebot zu antworten, stand K. ein Weilchen lang still. Vielleicht würden ihn die beiden, wenn er die Tür des folgenden Zimmers oder gar die Tür des Vorzimmers öffnete, gar nicht zu hindern wagen, vielleicht wäre es die einfachste Lösung des Ganzen, daß er es auf die Spitze trieb. Aber vielleicht würden sie ihn doch packen und, war er einmal niedergeworfen, so war auch alle Überlegenheit verloren, die er jetzt ihnen gegenüber in gewisser Hinsicht doch wahrte. Deshalb zog er die Sicherheit der Lösung vor, wie sie der natürliche Verlauf bringen mußte, und ging in sein Zimmer zurück, ohne daß von seiner Seite oder von Seite der Wächter ein weiteres Wort gefallen wäre. + +Er warf sich auf sein Bett und nahm vom Waschtisch einen schönen Apfel, den er sich gestern abend für das Frühstück vorbereitet hatte. Jetzt war er sein einziges Frühstück und jedenfalls, wie er sich beim ersten großen Bissen versicherte, viel besser, als das Frühstück aus dem schmutzigen Nachtcafé gewesen wäre, das er durch die Gnade der Wächter hätte bekommen können. Er fühlte sich wohl und zuversichtlich, in der Bank versäumte er zwar heute vormittag seinen Dienst, aber das war bei der verhältnismäßig hohen Stellung, die er dort einnahm, leicht entschuldigt. Sollte er die wirkliche Entschuldigung anführen? Er gedachte es zu tun, Würde man ihm nicht glauben, was in diesem Fall begreiflich war, so konnte er Frau Grubach als Zeugin führen oder auch die beiden Alten von drüben, die wohl jetzt auf dem Marsch zum gegenüberliegenden Fenster waren. Es wunderte K., wenigstens aus dem Gedankengang der Wächter wunderte es ihn, daß sie ihn in das Zimmer getrieben und ihn hier allein gelassen hatten, wo er doch zehnfache Möglichkeit hatte, sich umzubringen. Gleichzeitig allerdings fragte er sich, diesmal aus seinem Gedankengang, was für einen Grund er haben könnte, es zu tun. Etwa weil die zwei nebenan saßen und sein Frühstück abgefangen hatten? Es wäre so sinnlos gewesen, sich umzubringen, daß er, selbst wenn er es hätte tun wollen, infolge der Sinnlosigkeit dazu nicht imstande gewesen wäre. Wäre die geistige Beschränktheit der Wächter nicht so auffallend gewesen, so hätte man annehmen können, daß auch sie, infolge der gleichen Überzeugung, keine Gefahr darin gesehen hätten, ihn allein zu lassen. Sie mochten jetzt, wenn sie wollten, zusehen, wie er zu einem Wandschränkchen ging, in dem er einen guten Schnaps aufbewahrte, wie er ein Gläschen zuerst zum Ersatz des Frühstücks leerte und wie er ein zweites Gläschen dazu bestimmte, sich Mut zu machen, das letztere nur aus Vorsicht für den unwahrscheinlichen Fall, daß es nötig sein sollte. + + diff --git a/Assignment_086/readme.md b/Assignment_086/readme.md index 48a6673..768f3fe 100644 --- a/Assignment_086/readme.md +++ b/Assignment_086/readme.md @@ -1,14 +1,14 @@ -# `List` und dessen Implementierungen +# `Set` und dessen Implementierungen [Musterlösung](solution/) ## Lernziel -Das Interface `List` und eine passende Implementierung einsetzen. +Das Interface `Set` und eine passende Implementierung einsetzen. ## Aufgabe -Gehen Sie in das Paket [pr2.collections.list](../sources/src/main/java/pr2/collections/list/). +Gehen Sie in das Paket [pr2.collections.set](../sources/src/main/java/pr2/collections/set/). 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. @@ -16,10 +16,12 @@ Leider wurde `WordCollector` von einem Entwickler geschrieben, der nichts von de 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` und deren Implementierungen verwendet werden. Ändern Sie die Schnittstellen und Parameter der Methoden von `String[]` auf `List`. 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. +Ändern Sie die Klasse nun so, dass anstatt Arrays `Set` und deren Implementierungen verwendet werden. Ändern Sie die Schnittstellen und Parameter der Methoden von `String[]` auf `Set` bzw. `List`. 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. __Hinweis:__ Die Konstruktion `String[] words = line.toLowerCase().split("[,. ]");` können Sie nicht durch Listen ersetzen, da die `split`-Methode Arrays verwendet. +Die Datei mit dem Text finden Sie unter [kafka.txt](../sources/src/main/resources/pr2/collections/set/kafka.txt). + ## Abgabe (optional) diff --git a/Assignment_086/solution/readme.md b/Assignment_086/solution/readme.md index 6157b4c..a7c6da7 100644 --- a/Assignment_086/solution/readme.md +++ b/Assignment_086/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: `List` und dessen Implementierungen +# Lösung: `Set` und dessen Implementierungen Musterlösung: -[pr2.collections.list](../../solutions/src/main/java/pr2/collections/list/) +[pr2.collections.set](../../solutions/src/main/java/pr2/collections/set/) diff --git a/Assignment_087/readme.md b/Assignment_087/readme.md index 6432de9..b094686 100644 --- a/Assignment_087/readme.md +++ b/Assignment_087/readme.md @@ -1,37 +1,26 @@ -# `Map` verwenden +# CommandLineSorter [Musterlösung](solution/) ## Lernziel -Das Interface `Map` und seine Implementierungen verwenden, um Daten effizient zu verarbeiten. +Sortieren von Collections. ## Aufgabe -Gehen Sie in das Paket [pr2.collections.map](../sources/src/main/java/pr2/collections/map/). +Gehen Sie in das Paket [pr2.collections.sorter_1](../sources/src/main/java/pr2/collections/sorter_1/). -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 `WordCount`. In dieser fehlen noch einige Elemente, damit das Programm korrekt funktionieren kann. - -Die innere Klasse `WordFrequency` muss das Sortieren unterstützen. Implementieren Sie daher das Interface `Comparable`. - -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: +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. ```console -er: 80 -sie: 66 -und: 64 -die: 59 -der: 51 -zu: 46 -es: 45 -nicht: 41 -das: 38 -in: 35 -... +> java CommandLineSorter Albert Dieter Sigmund Thomas Frank Dieter Herbert +Albert +Dieter +Dieter +Frank +Herbert +Sigmund +Thomas ``` diff --git a/Assignment_087/solution/readme.md b/Assignment_087/solution/readme.md index cd64cf7..6c8a0cf 100644 --- a/Assignment_087/solution/readme.md +++ b/Assignment_087/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: `Map` verwenden +# Lösung: CommandLineSorter Musterlösung: -[pr2.collections.map](../../solutions/src/main/java/pr2/collections/map/) +[pr2.collections.sorter_1](../../solutions/src/main/java/pr2/collections/sorter_1/) diff --git a/Assignment_088/readme.md b/Assignment_088/readme.md index 45da4e9..45b249d 100644 --- a/Assignment_088/readme.md +++ b/Assignment_088/readme.md @@ -1,18 +1,26 @@ -# ReverserGeneric +# CommandLineSorter -- Version 2 [Musterlösung](solution/) ## Lernziel -`Comparable` verstehen und nutzen. +Sortieren von Collections. ## 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_2](../sources/src/main/java/pr2/collections/sorter_2/). -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. 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) diff --git a/Assignment_088/solution/readme.md b/Assignment_088/solution/readme.md index 727c05e..be55751 100644 --- a/Assignment_088/solution/readme.md +++ b/Assignment_088/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: ReverserGeneric +# Lösung: CommandLineSorter -- Version 2 Musterlösung: -[pr2.collections.reverser_generic](../../solutions/src/main/java/pr2/collections/reverser_generic/) +[pr2.collections.sorter_2](../../solutions/src/main/java/pr2/collections/sorter_2/) diff --git a/Assignment_089/readme.md b/Assignment_089/readme.md index 6770802..9db1174 100644 --- a/Assignment_089/readme.md +++ b/Assignment_089/readme.md @@ -1,18 +1,22 @@ -# Strings umgekehrt sortieren: Reverser +# `Comparator` verwenden und Objekte sortieren [Musterlösung](solution/) ## Lernziel -`Comparable` verstehen und nutzen. +Verschiedene Sortierreihenfolgen durch die Implementierung von `Comparator` realisieren. ## Aufgabe -Gehen Sie in das Paket [pr2.collections.reverser](../sources/src/main/java/pr2/collections/reverser/). +Gehen Sie in das Paket [pr2.collections.sortieren](../sources/src/main/java/pr2/collections/sortieren/). -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. +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. -Testen Sie Ihre Implementierung mit der Klasse `ReverserTest`. +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) diff --git a/Assignment_089/solution/readme.md b/Assignment_089/solution/readme.md index 297fa12..f543e35 100644 --- a/Assignment_089/solution/readme.md +++ b/Assignment_089/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: Strings umgekehrt sortieren: Reverser +# Lösung: `Comparator` verwenden und Objekte sortieren Musterlösung: -[pr2.collections.reverser](../../solutions/src/main/java/pr2/collections/reverser/) +[pr2.collections.sortieren](../../solutions/src/main/java/pr2/collections/sortieren/) diff --git a/Assignment_090/readme.md b/Assignment_090/readme.md index 8f28425..5cc4e93 100644 --- a/Assignment_090/readme.md +++ b/Assignment_090/readme.md @@ -1,24 +1,31 @@ -# `Set` und dessen Implementierungen +# Wörterbuchprogramm [Musterlösung](solution/) ## Lernziel -Das Interface `Set` und eine passende Implementierung einsetzen. +Interface `Map` und seine Implementierungen einsetzen. ## Aufgabe -Gehen Sie in das Paket [pr2.collections.set](../sources/src/main/java/pr2/collections/set/). +Gehen Sie in das Paket [pr2.collections.woerterbuch](../sources/src/main/java/pr2/collections/woerterbuch/). -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 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. -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. +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. -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. +```console +> java Woerterbuch +Bitte mindestens ein Wort angeben! +``` -Ändern Sie die Klasse nun so, dass anstatt Arrays `Set` und deren Implementierungen verwendet werden. Ändern Sie die Schnittstellen und Parameter der Methoden von `String[]` auf `Set` bzw. `List`. 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. - -__Hinweis:__ Die Konstruktion `String[] words = line.toLowerCase().split("[,. ]");` können Sie nicht durch Listen ersetzen, da die `split`-Methode Arrays verwendet. +```console +>java Woerterbuch gehen schlafen tanzen hopsen +gehen => go +schlafen => sleep +tanzen => dance +hopsen => +``` ## Abgabe (optional) diff --git a/Assignment_090/solution/readme.md b/Assignment_090/solution/readme.md index a7c6da7..8fa5708 100644 --- a/Assignment_090/solution/readme.md +++ b/Assignment_090/solution/readme.md @@ -1,5 +1,5 @@ -# Lösung: `Set` und dessen Implementierungen +# Lösung: Wörterbuchprogramm Musterlösung: -[pr2.collections.set](../../solutions/src/main/java/pr2/collections/set/) +[pr2.collections.woerterbuch](../../solutions/src/main/java/pr2/collections/woerterbuch/) diff --git a/Assignment_091/readme.md b/Assignment_091/readme.md deleted file mode 100644 index b094686..0000000 --- a/Assignment_091/readme.md +++ /dev/null @@ -1,36 +0,0 @@ -# CommandLineSorter - - [Musterlösung](solution/) - -## Lernziel - -Sortieren von Collections. - -## Aufgabe - -Gehen Sie in das Paket [pr2.collections.sorter_1](../sources/src/main/java/pr2/collections/sorter_1/). - -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. - -```console -> java CommandLineSorter Albert Dieter Sigmund Thomas Frank Dieter Herbert -Albert -Dieter -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`. \ No newline at end of file diff --git a/Assignment_091/solution/readme.md b/Assignment_091/solution/readme.md deleted file mode 100644 index 6c8a0cf..0000000 --- a/Assignment_091/solution/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# Lösung: CommandLineSorter - -Musterlösung: - -[pr2.collections.sorter_1](../../solutions/src/main/java/pr2/collections/sorter_1/) diff --git a/Assignment_092/readme.md b/Assignment_092/readme.md deleted file mode 100644 index 45b249d..0000000 --- a/Assignment_092/readme.md +++ /dev/null @@ -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`. \ No newline at end of file diff --git a/Assignment_092/solution/readme.md b/Assignment_092/solution/readme.md deleted file mode 100644 index be55751..0000000 --- a/Assignment_092/solution/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# Lösung: CommandLineSorter -- Version 2 - -Musterlösung: - -[pr2.collections.sorter_2](../../solutions/src/main/java/pr2/collections/sorter_2/) diff --git a/Assignment_093/readme.md b/Assignment_093/readme.md deleted file mode 100644 index 9db1174..0000000 --- a/Assignment_093/readme.md +++ /dev/null @@ -1,31 +0,0 @@ -# `Comparator` verwenden und Objekte sortieren - - [Musterlösung](solution/) - -## Lernziel - -Verschiedene Sortierreihenfolgen durch die Implementierung von `Comparator` 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`. \ No newline at end of file diff --git a/Assignment_093/solution/readme.md b/Assignment_093/solution/readme.md deleted file mode 100644 index f543e35..0000000 --- a/Assignment_093/solution/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# Lösung: `Comparator` verwenden und Objekte sortieren - -Musterlösung: - -[pr2.collections.sortieren](../../solutions/src/main/java/pr2/collections/sortieren/) diff --git a/Assignment_094/readme.md b/Assignment_094/readme.md deleted file mode 100644 index 5cc4e93..0000000 --- a/Assignment_094/readme.md +++ /dev/null @@ -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 => -``` - - -## 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`. \ No newline at end of file diff --git a/Assignment_094/solution/readme.md b/Assignment_094/solution/readme.md deleted file mode 100644 index 8fa5708..0000000 --- a/Assignment_094/solution/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# Lösung: Wörterbuchprogramm - -Musterlösung: - -[pr2.collections.woerterbuch](../../solutions/src/main/java/pr2/collections/woerterbuch/) diff --git a/readme.md b/readme.md index 016e0fd..a6e9254 100644 --- a/readme.md +++ b/readme.md @@ -48,57 +48,53 @@ Hinweise zur nötigen Softwareausstattung finden Sie [hier](help/softwareausstat | 38. | n/a | [Eigene Enumeration schreiben und verwenden](Assignment_038/readme.md) | [✅](Assignment_038/solution/) | | 39. | n/a | [Enumeration schreiben](Assignment_039/readme.md) | [✅](Assignment_039/solution/) | | 40. | n/a | [Singleton-Eigenschaft von Enumerationen](Assignment_040/readme.md) | [✅](Assignment_040/solution/) | -| 41. | n/a | [Eine vorhandene Enumeration nutzen](Assignment_041/readme.md) | [✅](Assignment_041/solution/) | -| 42. | n/a | [Stein, Papier, Schere, Echse, Spock](Assignment_042/readme.md) | [✅](Assignment_042/solution/) | -| 43. | n/a | [Ausnahmen testen](Assignment_043/readme.md) | [✅](Assignment_043/solution/) | -| 44. | n/a | [Eigene Ausnahmen schreiben und an entsprechender Stelle werfen](Assignment_044/readme.md) | [✅](Assignment_044/solution/) | -| 45. | n/a | [Eigene Exception schreiben](Assignment_045/readme.md) | [✅](Assignment_045/solution/) | -| 46. | n/a | [Handle-or-Declare-Regel anwenden](Assignment_046/readme.md) | [✅](Assignment_046/solution/) | -| 47. | n/a | [Ausnahmen mit `try` und `catch` behandeln.](Assignment_047/readme.md) | [✅](Assignment_047/solution/) | -| 48. | n/a | [`BufferedReader` zum zeilenweisen Lesen einsetzen](Assignment_048/readme.md) | [✅](Assignment_048/solution/) | -| 49. | n/a | [DataOutputStream](Assignment_049/readme.md) | [✅](Assignment_049/solution/) | -| 50. | n/a | [DataOutputStream durch Serialisierung ersetzen](Assignment_050/readme.md) | [✅](Assignment_050/solution/) | -| 51. | n/a | [Daten mit `DataOutputStream` und `DataInputStream` verarbeiten](Assignment_051/readme.md) | [✅](Assignment_051/solution/) | -| 52. | n/a | [Daten mit einem `InputStream` lesen](Assignment_052/readme.md) | [✅](Assignment_052/solution/) | -| 53. | n/a | [Daten mit einem `OutputStream` schreiben](Assignment_053/readme.md) | [✅](Assignment_053/solution/) | -| 54. | n/a | [Filesystem-Abstraktion mit `File`](Assignment_054/readme.md) | [✅](Assignment_054/solution/) | -| 55. | n/a | [Fileattribute lesen](Assignment_055/readme.md) | [✅](Assignment_055/solution/) | -| 56. | n/a | [`FilterReader`](Assignment_056/readme.md) | [✅](Assignment_056/solution/) | -| 57. | n/a | [Konsolen Input/Output](Assignment_057/readme.md) | [✅](Assignment_057/solution/) | -| 58. | n/a | [Zeilen einer Textdatei zählen](Assignment_058/readme.md) | [✅](Assignment_058/solution/) | -| 59. | n/a | [`RandomAccessFile`](Assignment_059/readme.md) | [✅](Assignment_059/solution/) | -| 60. | n/a | [`Reader` verwenden](Assignment_060/readme.md) | [✅](Assignment_060/solution/) | -| 61. | n/a | [Rot13-Verschlüsselung](Assignment_061/readme.md) | [✅](Assignment_061/solution/) | -| 62. | n/a | [Datei zerhacken](Assignment_062/readme.md) | [✅](Assignment_062/solution/) | -| 63. | n/a | [Serialisierung](Assignment_063/readme.md) | [✅](Assignment_063/solution/) | -| 64. | n/a | [Einen generischen Typ schreiben](Assignment_064/readme.md) | [✅](Assignment_064/solution/) | -| 65. | n/a | [Generische Klasse Pair schreiben](Assignment_065/readme.md) | [✅](Assignment_065/solution/) | -| 66. | n/a | [Generische Klasse Pair erweitern: NumberPair](Assignment_066/readme.md) | [✅](Assignment_066/solution/) | -| 67. | n/a | [Generische Klasse Pair erweitern: SamePair](Assignment_067/readme.md) | [✅](Assignment_067/solution/) | -| 68. | n/a | [PairList](Assignment_068/readme.md) | [✅](Assignment_068/solution/) | -| 69. | n/a | [Wildcard benutzen](Assignment_069/readme.md) | [✅](Assignment_069/solution/) | -| 70. | n/a | [Generische Queue](Assignment_070/readme.md) | [✅](Assignment_070/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/) | -| 73. | n/a | [Generische Typen zusammen mit Wildcards einsetzen](Assignment_073/readme.md) | [✅](Assignment_073/solution/) | -| 74. | n/a | [Eigene compare-Methode schreiben](Assignment_074/readme.md) | [✅](Assignment_074/solution/) | -| 75. | n/a | [Innere Klasse Beobachter](Assignment_075/readme.md) | [✅](Assignment_075/solution/) | -| 76. | n/a | [Callback mit anonymer Klasse realisieren](Assignment_076/readme.md) | [✅](Assignment_076/solution/) | -| 77. | n/a | [Comparator als Lambda](Assignment_077/readme.md) | [✅](Assignment_077/solution/) | -| 78. | n/a | [Callback mit Lambda realisieren](Assignment_078/readme.md) | [✅](Assignment_078/solution/) | -| 79. | n/a | [MatrixSuche](Assignment_079/readme.md) | [✅](Assignment_079/solution/) | -| 80. | n/a | [StringTransmogrifier](Assignment_080/readme.md) | [✅](Assignment_080/solution/) | -| 81. | n/a | [StringTransmogrifier erweitern](Assignment_081/readme.md) | [✅](Assignment_081/solution/) | -| 82. | n/a | [Static Member Class](Assignment_082/readme.md) | [✅](Assignment_082/solution/) | -| 83. | n/a | [Iterator schreiben](Assignment_083/readme.md) | [✅](Assignment_083/solution/) | -| 84. | n/a | [Mithilfe eines Iterators über Daten iterieren](Assignment_084/readme.md) | [✅](Assignment_084/solution/) | -| 85. | n/a | [Iterator programmieren](Assignment_085/readme.md) | [✅](Assignment_085/solution/) | -| 86. | n/a | [`List` und dessen Implementierungen](Assignment_086/readme.md) | [✅](Assignment_086/solution/) | -| 87. | n/a | [`Map` verwenden](Assignment_087/readme.md) | [✅](Assignment_087/solution/) | -| 88. | n/a | [ReverserGeneric](Assignment_088/readme.md) | [✅](Assignment_088/solution/) | -| 89. | n/a | [Strings umgekehrt sortieren: Reverser](Assignment_089/readme.md) | [✅](Assignment_089/solution/) | -| 90. | n/a | [`Set` und dessen Implementierungen](Assignment_090/readme.md) | [✅](Assignment_090/solution/) | -| 91. | n/a | [CommandLineSorter](Assignment_091/readme.md) | [✅](Assignment_091/solution/) | -| 92. | n/a | [CommandLineSorter -- Version 2](Assignment_092/readme.md) | [✅](Assignment_092/solution/) | -| 93. | n/a | [`Comparator` verwenden und Objekte sortieren](Assignment_093/readme.md) | [✅](Assignment_093/solution/) | -| 94. | n/a | [Wörterbuchprogramm](Assignment_094/readme.md) | [✅](Assignment_094/solution/) | +| 41. | n/a | [Stein, Papier, Schere, Echse, Spock](Assignment_041/readme.md) | [✅](Assignment_041/solution/) | +| 42. | n/a | [Ausnahmen testen](Assignment_042/readme.md) | [✅](Assignment_042/solution/) | +| 43. | n/a | [Eigene Ausnahmen schreiben und an entsprechender Stelle werfen](Assignment_043/readme.md) | [✅](Assignment_043/solution/) | +| 44. | n/a | [Eigene Exception schreiben](Assignment_044/readme.md) | [✅](Assignment_044/solution/) | +| 45. | n/a | [Handle-or-Declare-Regel anwenden](Assignment_045/readme.md) | [✅](Assignment_045/solution/) | +| 46. | n/a | [Ausnahmen mit `try` und `catch` behandeln.](Assignment_046/readme.md) | [✅](Assignment_046/solution/) | +| 47. | n/a | [`BufferedReader` zum zeilenweisen Lesen einsetzen](Assignment_047/readme.md) | [✅](Assignment_047/solution/) | +| 48. | n/a | [DataOutputStream](Assignment_048/readme.md) | [✅](Assignment_048/solution/) | +| 49. | n/a | [DataOutputStream durch Serialisierung ersetzen](Assignment_049/readme.md) | [✅](Assignment_049/solution/) | +| 50. | n/a | [Daten mit `DataOutputStream` und `DataInputStream` verarbeiten](Assignment_050/readme.md) | [✅](Assignment_050/solution/) | +| 51. | n/a | [Daten mit einem `InputStream` lesen](Assignment_051/readme.md) | [✅](Assignment_051/solution/) | +| 52. | n/a | [Daten mit einem `OutputStream` schreiben](Assignment_052/readme.md) | [✅](Assignment_052/solution/) | +| 53. | n/a | [Filesystem-Abstraktion mit `File`](Assignment_053/readme.md) | [✅](Assignment_053/solution/) | +| 54. | n/a | [Fileattribute lesen](Assignment_054/readme.md) | [✅](Assignment_054/solution/) | +| 55. | n/a | [`FilterReader`](Assignment_055/readme.md) | [✅](Assignment_055/solution/) | +| 56. | n/a | [Konsolen Input/Output](Assignment_056/readme.md) | [✅](Assignment_056/solution/) | +| 57. | n/a | [Zeilen einer Textdatei zählen](Assignment_057/readme.md) | [✅](Assignment_057/solution/) | +| 58. | n/a | [`RandomAccessFile`](Assignment_058/readme.md) | [✅](Assignment_058/solution/) | +| 59. | n/a | [`Reader` verwenden](Assignment_059/readme.md) | [✅](Assignment_059/solution/) | +| 60. | n/a | [Rot13-Verschlüsselung](Assignment_060/readme.md) | [✅](Assignment_060/solution/) | +| 61. | n/a | [Datei zerhacken](Assignment_061/readme.md) | [✅](Assignment_061/solution/) | +| 62. | n/a | [Serialisierung](Assignment_062/readme.md) | [✅](Assignment_062/solution/) | +| 63. | n/a | [Einen generischen Typ schreiben](Assignment_063/readme.md) | [✅](Assignment_063/solution/) | +| 64. | n/a | [Generische Klasse Pair schreiben](Assignment_064/readme.md) | [✅](Assignment_064/solution/) | +| 65. | n/a | [Generische Klasse Pair erweitern: NumberPair](Assignment_065/readme.md) | [✅](Assignment_065/solution/) | +| 66. | n/a | [Generische Klasse Pair erweitern: SamePair](Assignment_066/readme.md) | [✅](Assignment_066/solution/) | +| 67. | n/a | [PairList](Assignment_067/readme.md) | [✅](Assignment_067/solution/) | +| 68. | n/a | [Wildcard benutzen](Assignment_068/readme.md) | [✅](Assignment_068/solution/) | +| 69. | n/a | [Generische Queue](Assignment_069/readme.md) | [✅](Assignment_069/solution/) | +| 70. | n/a | [`super` und `extends` einsetzen](Assignment_070/readme.md) | [✅](Assignment_070/solution/) | +| 71. | n/a | [Generische Typen zusammen mit Wildcards einsetzen](Assignment_071/readme.md) | [✅](Assignment_071/solution/) | +| 72. | n/a | [Eigene compare-Methode schreiben](Assignment_072/readme.md) | [✅](Assignment_072/solution/) | +| 73. | n/a | [Innere Klasse Beobachter](Assignment_073/readme.md) | [✅](Assignment_073/solution/) | +| 74. | n/a | [Callback mit anonymer Klasse realisieren](Assignment_074/readme.md) | [✅](Assignment_074/solution/) | +| 75. | n/a | [Comparator als Lambda](Assignment_075/readme.md) | [✅](Assignment_075/solution/) | +| 76. | n/a | [Callback mit Lambda realisieren](Assignment_076/readme.md) | [✅](Assignment_076/solution/) | +| 77. | n/a | [MatrixSuche](Assignment_077/readme.md) | [✅](Assignment_077/solution/) | +| 78. | n/a | [StringTransmogrifier](Assignment_078/readme.md) | [✅](Assignment_078/solution/) | +| 79. | n/a | [StringTransmogrifier erweitern](Assignment_079/readme.md) | [✅](Assignment_079/solution/) | +| 80. | n/a | [Iterator schreiben](Assignment_080/readme.md) | [✅](Assignment_080/solution/) | +| 81. | n/a | [Iterator programmieren](Assignment_081/readme.md) | [✅](Assignment_081/solution/) | +| 82. | n/a | [`List` und dessen Implementierungen](Assignment_082/readme.md) | [✅](Assignment_082/solution/) | +| 83. | n/a | [`Map` verwenden](Assignment_083/readme.md) | [✅](Assignment_083/solution/) | +| 84. | n/a | [ReverserGeneric](Assignment_084/readme.md) | [✅](Assignment_084/solution/) | +| 85. | n/a | [Strings umgekehrt sortieren: Reverser](Assignment_085/readme.md) | [✅](Assignment_085/solution/) | +| 86. | n/a | [`Set` und dessen Implementierungen](Assignment_086/readme.md) | [✅](Assignment_086/solution/) | +| 87. | n/a | [CommandLineSorter](Assignment_087/readme.md) | [✅](Assignment_087/solution/) | +| 88. | n/a | [CommandLineSorter -- Version 2](Assignment_088/readme.md) | [✅](Assignment_088/solution/) | +| 89. | n/a | [`Comparator` verwenden und Objekte sortieren](Assignment_089/readme.md) | [✅](Assignment_089/solution/) | +| 90. | n/a | [Wörterbuchprogramm](Assignment_090/readme.md) | [✅](Assignment_090/solution/) | diff --git a/solutions/src/main/java/pr2/collections/iterieren/CoinGenerator.java b/solutions/src/main/java/pr2/collections/iterieren/CoinGenerator.java deleted file mode 100644 index acb849f..0000000 --- a/solutions/src/main/java/pr2/collections/iterieren/CoinGenerator.java +++ /dev/null @@ -1,115 +0,0 @@ -package pr2.collections.iterieren; - -import de.smits_net.games.framework.board.Board; -import de.smits_net.games.framework.image.SimpleImage; -import de.smits_net.games.framework.sprite.Sprite; -import de.smits_net.games.framework.sprite.Sprite.BoundaryPolicy; - -import java.awt.Point; -import java.util.Iterator; -import java.util.Random; - -/** - * Klasse, die eine beliebige Menge an Geld generiert. - */ -public class CoinGenerator implements Iterable { - - /** - * Zufallszahlen-Generator. - */ - private static final Random RND = new Random(); - - /** - * Das Spielfeld. - */ - private final Board board; - - /** - * Anzahl der Münzen, die erzeugt werden sollen. - */ - int number; // nicht private wegen innerer Klasse - - /** - * Erzeugt eine neue Instanz, die zu dem übergebenen Spielfeld gehört. - * - * @param board Das Spielfeld. - * @param number Anzahl der Münzen. - */ - public CoinGenerator(Board board, int number) { - this.board = board; - this.number = number; - } - - /** - * Erzeugt einen neuen Iterator. - * - * @return Der Iterator. - */ - @Override - public Iterator iterator() { - return new Iterator() { - - int count = 0; - - @Override - public boolean hasNext() { - return count < number; - } - - @Override - public Sprite next() { - count++; - return createCoin(); - } - }; - } - - /** - * Legt eine zufällige Münze an. - * - * @return die Münze als Sprite. - */ - Sprite createCoin() { - final String prefix = "pr2/collections/iterieren"; - - String asset; - - switch (RND.nextInt(8)) { - case 0: - asset = prefix + "/1c.png"; - break; - case 1: - asset = prefix + "/2c.png"; - break; - case 3: - asset = prefix + "/5c.png"; - break; - case 4: - asset = prefix + "/10c.png"; - break; - case 5: - asset = prefix + "/20c.png"; - break; - case 6: - asset = prefix + "/50c.png"; - break; - case 7: - asset = prefix + "/1e.png"; - break; - default: - asset = prefix + "/2e.png"; - break; - } - - int xPos = RND.nextInt(board.getWidth()) - 20; - int yPos = RND.nextInt(board.getHeight()) - 20; - - return new Sprite(board, new Point(xPos, yPos), BoundaryPolicy.NONE, - new SimpleImage(asset)) { - @Override - protected void mousePressed() { - this.setVisible(false); - } - }; - } -} diff --git a/solutions/src/main/java/pr2/collections/iterieren/GameBoard.java b/solutions/src/main/java/pr2/collections/iterieren/GameBoard.java deleted file mode 100644 index 275c613..0000000 --- a/solutions/src/main/java/pr2/collections/iterieren/GameBoard.java +++ /dev/null @@ -1,66 +0,0 @@ -package pr2.collections.iterieren; - -import de.smits_net.games.framework.board.Board; -import de.smits_net.games.framework.sprite.Sprite; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.util.Iterator; - -/** - * Spielfeld. - */ -public class GameBoard extends Board { - - /** - * Anzahl der Münzen. - */ - private static final int NUM_COINS = 1000; - - /** - * Münzgenerator. - */ - private final CoinGenerator generator; - - /** - * Münzen auf dem Spielfeld. - */ - private final Sprite[] coins = new Sprite[NUM_COINS]; - - /** - * Erzeugt ein neues Board. - */ - public GameBoard() { - // neues Spielfeld anlegen - super(10, new Dimension(600, 600), Color.BLACK); - - generator = new CoinGenerator(this, NUM_COINS); - - int count = 0; - Iterator it = generator.iterator(); - - while (it.hasNext()) { - coins[count++] = it.next(); - } - } - - - /** - * Spielfeld neu zeichnen. Wird vom Framework aufgerufen. - */ - @Override - public synchronized void drawGame(Graphics g) { - for (Sprite sprite : coins) { - sprite.draw(g); - } - } - - /** - * Spielsituation updaten. Wird vom Framework aufgerufen. - */ - @Override - public boolean updateGame() { - return true; - } -} diff --git a/solutions/src/main/java/pr2/collections/iterieren/GameMain.java b/solutions/src/main/java/pr2/collections/iterieren/GameMain.java deleted file mode 100644 index 2f4c578..0000000 --- a/solutions/src/main/java/pr2/collections/iterieren/GameMain.java +++ /dev/null @@ -1,28 +0,0 @@ -package pr2.collections.iterieren; - -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 the coins as fast as you can", new GameBoard()); - } - - /** - * Startpunkt. - * - * @param args command line arguments. - */ - public static void main(String[] args) { - // Spiel starten - EventQueue.invokeLater(GameMain::new); - } -} diff --git a/solutions/src/main/java/pr2/collections/list/WordCollector.java b/solutions/src/main/java/pr2/collections/list/WordCollector.java index 84b9e0d..5cd18da 100644 --- a/solutions/src/main/java/pr2/collections/list/WordCollector.java +++ b/solutions/src/main/java/pr2/collections/list/WordCollector.java @@ -114,7 +114,7 @@ public class WordCollector { try { List words = listWords( - "pr2/collections/list/kafka.txt"); + "kafka.txt"); System.out.println(words); } catch (IOException e) { System.err.println("Probleme beim Dateizugriff: " + e); @@ -256,7 +256,7 @@ public class WordCollector { // // try { // String[] words = listWords( -// "pr2/collections/list/kafka.txt"); +// "kafka.txt"); // System.out.println(Arrays.toString(words)); // } // catch (IOException e) { diff --git a/solutions/src/main/java/pr2/collections/map/WordCount.java b/solutions/src/main/java/pr2/collections/map/WordCount.java index cd18cba..c152f88 100644 --- a/solutions/src/main/java/pr2/collections/map/WordCount.java +++ b/solutions/src/main/java/pr2/collections/map/WordCount.java @@ -71,7 +71,7 @@ public class WordCount { try { List words = countWords( - "pr2/collections/map/kafka.txt"); + "kafka.txt"); for (WordFrequency word : words) { System.out.println(word); diff --git a/solutions/src/main/java/pr2/collections/set/WordCollector.java b/solutions/src/main/java/pr2/collections/set/WordCollector.java index 177d6fc..3e13dea 100644 --- a/solutions/src/main/java/pr2/collections/set/WordCollector.java +++ b/solutions/src/main/java/pr2/collections/set/WordCollector.java @@ -72,7 +72,7 @@ public class WordCollector { public static void main(String[] args) { try { - List words = listWords("pr2/collections/set/kafka.txt"); + List words = listWords("kafka.txt"); System.out.println(words); } catch (IOException e) { System.err.println("Probleme beim Dateizugriff: " + e); diff --git a/solutions/src/main/java/pr2/enums/verwenden/GameBoard.java b/solutions/src/main/java/pr2/enums/verwenden/GameBoard.java deleted file mode 100644 index a0c12b5..0000000 --- a/solutions/src/main/java/pr2/enums/verwenden/GameBoard.java +++ /dev/null @@ -1,47 +0,0 @@ -package pr2.enums.verwenden; - -import de.smits_net.games.framework.board.Board; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Point; - -/** - * Spielfeld. - */ -public class GameBoard extends Board { - - /** - * Sprite, das durch das Bild läuft. - */ - private final Professor sprite; - - /** - * Erzeugt ein neues Board. - */ - public GameBoard() { - // neues Spielfeld anlegen - super(10, new Dimension(400, 400), Color.BLACK); - - // Sprite initialisieren - sprite = new Professor(this, new Point(300, 200)); - } - - /** - * Spielfeld neu zeichnen. Wird vom Framework aufgerufen. - */ - @Override - public void drawGame(Graphics g) { - sprite.draw(g, this); - } - - /** - * Spielsituation updaten. Wird vom Framework aufgerufen. - */ - @Override - public boolean updateGame() { - sprite.move(); - return sprite.isVisible(); - } -} diff --git a/solutions/src/main/java/pr2/enums/verwenden/GameMain.java b/solutions/src/main/java/pr2/enums/verwenden/GameMain.java deleted file mode 100644 index becc1ae..0000000 --- a/solutions/src/main/java/pr2/enums/verwenden/GameMain.java +++ /dev/null @@ -1,28 +0,0 @@ -package pr2.enums.verwenden; - -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("Watch me walk...", new GameBoard()); - } - - /** - * Startpunkt. - * - * @param args command line arguments. - */ - public static void main(String[] args) { - // Spiel starten - EventQueue.invokeLater(GameMain::new); - } -} diff --git a/solutions/src/main/java/pr2/enums/verwenden/Professor.java b/solutions/src/main/java/pr2/enums/verwenden/Professor.java deleted file mode 100644 index 6d648a4..0000000 --- a/solutions/src/main/java/pr2/enums/verwenden/Professor.java +++ /dev/null @@ -1,32 +0,0 @@ -package pr2.enums.verwenden; - -import de.smits_net.games.framework.board.Board; -import de.smits_net.games.framework.image.AnimatedImage; -import de.smits_net.games.framework.sprite.AnimatedSprite; -import de.smits_net.games.framework.sprite.Direction; - -import java.awt.Point; - -/** - * Ein Sprite. - */ -public class Professor extends AnimatedSprite { - - /** - * Geschwindigkeit der Figur in X-Richtung. - */ - private static final int SPRITE_SPEED = 2; - - /** - * Neues Sprite anlegen. - * - * @param board das Spielfeld - * @param startPoint Start-Position - */ - public Professor(Board board, Point startPoint) { - super(board, startPoint, BoundaryPolicy.NONE, - new AnimatedImage(50, 9, - "pr2/enums/use/professor_left")); - velocity.setVelocity(Direction.WEST, SPRITE_SPEED); - } -} diff --git a/solutions/src/main/java/pr2/generics/verwenden/GameBoard.java b/solutions/src/main/java/pr2/generics/verwenden/GameBoard.java deleted file mode 100644 index 9de262e..0000000 --- a/solutions/src/main/java/pr2/generics/verwenden/GameBoard.java +++ /dev/null @@ -1,169 +0,0 @@ -package pr2.generics.verwenden; - -import de.smits_net.games.framework.board.Board; -import de.smits_net.games.framework.image.SimpleImage; -import de.smits_net.games.framework.sprite.Sprite; -import de.smits_net.games.framework.sprite.Sprite.BoundaryPolicy; -import de.smits_net.games.framework.sprite.Velocity; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Point; -import java.awt.event.MouseEvent; -import java.util.Random; -import java.util.Stack; - -/** - * Spielfeld. - */ -public class GameBoard extends Board { - - /** - * Zufallszahlengenerator. - */ - private final Random rnd = new Random(); - - /** - * Münzstapel. - */ - private final Stack stapel = new Stack<>(); - - /** - * A moving coin. - */ - private Sprite moving; - - /** - * Punkte. - */ - private int points = 0; - - /** - * Zeitpunkt des ersten Klicks. - */ - private long startzeit; - - /** - * Erzeugt ein neues Board. - */ - public GameBoard() { - // neues Spielfeld anlegen - super(10, new Dimension(400, 400), Color.BLACK); - - // Münzen anlegen - for (int i = 0; i < 20; i++) { - stapel.push(createCoin()); - } - } - - /** - * Legt eine zufällige Münze an. - * - * @return die Münze als Sprite. - */ - private Sprite createCoin() { - final String prefix = "pr2/generics/verwendung"; - - String asset; - - switch (rnd.nextInt(8)) { - case 0: - asset = prefix + "/1c.png"; - break; - case 1: - asset = prefix + "/2c.png"; - break; - case 3: - asset = prefix + "/5c.png"; - break; - case 4: - asset = prefix + "/10c.png"; - break; - case 5: - asset = prefix + "/20c.png"; - break; - case 6: - asset = prefix + "/50c.png"; - break; - case 7: - asset = prefix + "/1e.png"; - break; - default: - asset = prefix + "/2e.png"; - break; - } - - int offset = rnd.nextInt(10); - - return new Sprite(this, new Point(100 + offset, 100 + offset), - BoundaryPolicy.NONE, new SimpleImage(asset)); - } - - /** - * Spielfeld neu zeichnen. Wird vom Framework aufgerufen. - */ - @Override - public synchronized void drawGame(Graphics g) { - for (Sprite sprite : stapel) { - sprite.draw(g, this); - } - - if (moving != null) { - moving.draw(g, this); - } - - writeText(g, 0, 20, "Punkte: " + points); - } - - /** - * Spielfeld zeichnen. - * - * @param g Grafik-Kontext. - */ - @Override - protected void drawGameOver(Graphics g) { - centerText(g, String.format("%d Punkte in %.2f Sekunden", points, - (System.currentTimeMillis() - startzeit) / 1000.0)); - } - - /** - * Mausklick abfangen. - * - * @param e Maus-Event. - */ - @Override - public synchronized void mouseClicked(MouseEvent e) { - - if (startzeit == 0) { - startzeit = System.currentTimeMillis(); - } - - if (stapel.isEmpty()) { - return; - } - - // Oberstes Sprite vom Stapel ansehen und s zuweisen - Sprite s = stapel.peek(); - - if (s.intersects(new Point(e.getX(), e.getY()))) { - points++; - s = stapel.pop(); - moving = s; - moving.setVelocity(new Velocity(0, 20)); - } - } - - /** - * Spielsituation updaten. Wird vom Framework aufgerufen. - */ - @Override - public boolean updateGame() { - - if (moving != null) { - moving.move(); - } - - return !stapel.isEmpty(); - } -} diff --git a/solutions/src/main/java/pr2/generics/verwenden/GameMain.java b/solutions/src/main/java/pr2/generics/verwenden/GameMain.java deleted file mode 100644 index c305e4a..0000000 --- a/solutions/src/main/java/pr2/generics/verwenden/GameMain.java +++ /dev/null @@ -1,28 +0,0 @@ -package pr2.generics.verwenden; - -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 the coins as fast as you can", new GameBoard()); - } - - /** - * Startpunkt. - * - * @param args command line arguments. - */ - public static void main(String[] args) { - // Spiel starten - EventQueue.invokeLater(GameMain::new); - } -} diff --git a/solutions/src/main/java/pr2/lambda/static_member/Alien.java b/solutions/src/main/java/pr2/lambda/static_member/Alien.java deleted file mode 100644 index 21722ee..0000000 --- a/solutions/src/main/java/pr2/lambda/static_member/Alien.java +++ /dev/null @@ -1,54 +0,0 @@ -package pr2.lambda.static_member; - -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(); - } -} diff --git a/solutions/src/main/java/pr2/lambda/static_member/GameBoard.java b/solutions/src/main/java/pr2/lambda/static_member/GameBoard.java deleted file mode 100644 index c1985ff..0000000 --- a/solutions/src/main/java/pr2/lambda/static_member/GameBoard.java +++ /dev/null @@ -1,111 +0,0 @@ -package pr2.lambda.static_member; - -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(); - } - - - /** - * Ein Alien. - */ - public static 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(); - } - } -} diff --git a/solutions/src/main/java/pr2/lambda/static_member/GameMain.java b/solutions/src/main/java/pr2/lambda/static_member/GameMain.java deleted file mode 100644 index 1011145..0000000 --- a/solutions/src/main/java/pr2/lambda/static_member/GameMain.java +++ /dev/null @@ -1,27 +0,0 @@ -package pr2.lambda.static_member; - -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 - (01) Static Member", new GameBoard()); - } - - /** - * Startpunkt. - * - * @param args command line arguments. - */ - public static void main(String[] args) { - EventQueue.invokeLater(GameMain::new); - } -} diff --git a/sources/src/main/java/pr2/collections/iterieren/CoinGenerator.java b/sources/src/main/java/pr2/collections/iterieren/CoinGenerator.java deleted file mode 100644 index acb849f..0000000 --- a/sources/src/main/java/pr2/collections/iterieren/CoinGenerator.java +++ /dev/null @@ -1,115 +0,0 @@ -package pr2.collections.iterieren; - -import de.smits_net.games.framework.board.Board; -import de.smits_net.games.framework.image.SimpleImage; -import de.smits_net.games.framework.sprite.Sprite; -import de.smits_net.games.framework.sprite.Sprite.BoundaryPolicy; - -import java.awt.Point; -import java.util.Iterator; -import java.util.Random; - -/** - * Klasse, die eine beliebige Menge an Geld generiert. - */ -public class CoinGenerator implements Iterable { - - /** - * Zufallszahlen-Generator. - */ - private static final Random RND = new Random(); - - /** - * Das Spielfeld. - */ - private final Board board; - - /** - * Anzahl der Münzen, die erzeugt werden sollen. - */ - int number; // nicht private wegen innerer Klasse - - /** - * Erzeugt eine neue Instanz, die zu dem übergebenen Spielfeld gehört. - * - * @param board Das Spielfeld. - * @param number Anzahl der Münzen. - */ - public CoinGenerator(Board board, int number) { - this.board = board; - this.number = number; - } - - /** - * Erzeugt einen neuen Iterator. - * - * @return Der Iterator. - */ - @Override - public Iterator iterator() { - return new Iterator() { - - int count = 0; - - @Override - public boolean hasNext() { - return count < number; - } - - @Override - public Sprite next() { - count++; - return createCoin(); - } - }; - } - - /** - * Legt eine zufällige Münze an. - * - * @return die Münze als Sprite. - */ - Sprite createCoin() { - final String prefix = "pr2/collections/iterieren"; - - String asset; - - switch (RND.nextInt(8)) { - case 0: - asset = prefix + "/1c.png"; - break; - case 1: - asset = prefix + "/2c.png"; - break; - case 3: - asset = prefix + "/5c.png"; - break; - case 4: - asset = prefix + "/10c.png"; - break; - case 5: - asset = prefix + "/20c.png"; - break; - case 6: - asset = prefix + "/50c.png"; - break; - case 7: - asset = prefix + "/1e.png"; - break; - default: - asset = prefix + "/2e.png"; - break; - } - - int xPos = RND.nextInt(board.getWidth()) - 20; - int yPos = RND.nextInt(board.getHeight()) - 20; - - return new Sprite(board, new Point(xPos, yPos), BoundaryPolicy.NONE, - new SimpleImage(asset)) { - @Override - protected void mousePressed() { - this.setVisible(false); - } - }; - } -} diff --git a/sources/src/main/java/pr2/collections/iterieren/GameBoard.java b/sources/src/main/java/pr2/collections/iterieren/GameBoard.java deleted file mode 100644 index 9a7c263..0000000 --- a/sources/src/main/java/pr2/collections/iterieren/GameBoard.java +++ /dev/null @@ -1,59 +0,0 @@ -package pr2.collections.iterieren; - -import de.smits_net.games.framework.board.Board; -import de.smits_net.games.framework.sprite.Sprite; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.util.Iterator; - -/** - * Spielfeld. - */ -public class GameBoard extends Board { - - /** - * Anzahl der Münzen. - */ - private static final int NUM_COINS = 1000; - - /** - * Münzgenerator. - */ - private final CoinGenerator generator; - - /** - * Münzen auf dem Spielfeld. - */ - private final Sprite[] coins = new Sprite[NUM_COINS]; - - /** - * Erzeugt ein neues Board. - */ - public GameBoard() { - // neues Spielfeld anlegen - super(10, new Dimension(600, 600), Color.BLACK); - - generator = new CoinGenerator(this, NUM_COINS); - - // TODO: Münzen generieren - } - - - /** - * Spielfeld neu zeichnen. Wird vom Framework aufgerufen. - */ - @Override - public synchronized void drawGame(Graphics g) { - // TODO: Münzen zeichnen - } - - /** - * Spielsituation updaten. Wird vom Framework aufgerufen. - */ - @Override - public boolean updateGame() { - return true; - } -} diff --git a/sources/src/main/java/pr2/collections/iterieren/GameMain.java b/sources/src/main/java/pr2/collections/iterieren/GameMain.java deleted file mode 100644 index 2f4c578..0000000 --- a/sources/src/main/java/pr2/collections/iterieren/GameMain.java +++ /dev/null @@ -1,28 +0,0 @@ -package pr2.collections.iterieren; - -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 the coins as fast as you can", new GameBoard()); - } - - /** - * Startpunkt. - * - * @param args command line arguments. - */ - public static void main(String[] args) { - // Spiel starten - EventQueue.invokeLater(GameMain::new); - } -} diff --git a/sources/src/main/java/pr2/collections/list/WordCollector.java b/sources/src/main/java/pr2/collections/list/WordCollector.java index 6236c80..b5f1a69 100644 --- a/sources/src/main/java/pr2/collections/list/WordCollector.java +++ b/sources/src/main/java/pr2/collections/list/WordCollector.java @@ -149,7 +149,7 @@ public class WordCollector { try { String[] words = listWords( - "pr2/collections/list/kafka.txt"); + "kafka.txt"); System.out.println(Arrays.toString(words)); } catch (IOException e) { diff --git a/sources/src/main/java/pr2/collections/map/WordCount.java b/sources/src/main/java/pr2/collections/map/WordCount.java index df7e14e..8436dd0 100644 --- a/sources/src/main/java/pr2/collections/map/WordCount.java +++ b/sources/src/main/java/pr2/collections/map/WordCount.java @@ -64,7 +64,7 @@ public class WordCount { try { List words = countWords( - "pr2/collections/map/kafka.txt"); + "kafka.txt"); for (WordFrequency word : words) { System.out.println(word); diff --git a/sources/src/main/java/pr2/collections/set/WordCollector.java b/sources/src/main/java/pr2/collections/set/WordCollector.java index 4ba75de..91c07d4 100644 --- a/sources/src/main/java/pr2/collections/set/WordCollector.java +++ b/sources/src/main/java/pr2/collections/set/WordCollector.java @@ -148,7 +148,7 @@ public class WordCollector { public static void main(String[] args) { try { - String[] words = listWords("pr2/collections/set/kafka.txt"); + String[] words = listWords("kafka.txt"); System.out.println(Arrays.toString(words)); } catch (IOException e) { diff --git a/sources/src/main/java/pr2/enums/verwenden/GameBoard.java b/sources/src/main/java/pr2/enums/verwenden/GameBoard.java deleted file mode 100644 index a0c12b5..0000000 --- a/sources/src/main/java/pr2/enums/verwenden/GameBoard.java +++ /dev/null @@ -1,47 +0,0 @@ -package pr2.enums.verwenden; - -import de.smits_net.games.framework.board.Board; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Point; - -/** - * Spielfeld. - */ -public class GameBoard extends Board { - - /** - * Sprite, das durch das Bild läuft. - */ - private final Professor sprite; - - /** - * Erzeugt ein neues Board. - */ - public GameBoard() { - // neues Spielfeld anlegen - super(10, new Dimension(400, 400), Color.BLACK); - - // Sprite initialisieren - sprite = new Professor(this, new Point(300, 200)); - } - - /** - * Spielfeld neu zeichnen. Wird vom Framework aufgerufen. - */ - @Override - public void drawGame(Graphics g) { - sprite.draw(g, this); - } - - /** - * Spielsituation updaten. Wird vom Framework aufgerufen. - */ - @Override - public boolean updateGame() { - sprite.move(); - return sprite.isVisible(); - } -} diff --git a/sources/src/main/java/pr2/enums/verwenden/GameMain.java b/sources/src/main/java/pr2/enums/verwenden/GameMain.java deleted file mode 100644 index becc1ae..0000000 --- a/sources/src/main/java/pr2/enums/verwenden/GameMain.java +++ /dev/null @@ -1,28 +0,0 @@ -package pr2.enums.verwenden; - -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("Watch me walk...", new GameBoard()); - } - - /** - * Startpunkt. - * - * @param args command line arguments. - */ - public static void main(String[] args) { - // Spiel starten - EventQueue.invokeLater(GameMain::new); - } -} diff --git a/sources/src/main/java/pr2/enums/verwenden/Professor.java b/sources/src/main/java/pr2/enums/verwenden/Professor.java deleted file mode 100644 index 6d648a4..0000000 --- a/sources/src/main/java/pr2/enums/verwenden/Professor.java +++ /dev/null @@ -1,32 +0,0 @@ -package pr2.enums.verwenden; - -import de.smits_net.games.framework.board.Board; -import de.smits_net.games.framework.image.AnimatedImage; -import de.smits_net.games.framework.sprite.AnimatedSprite; -import de.smits_net.games.framework.sprite.Direction; - -import java.awt.Point; - -/** - * Ein Sprite. - */ -public class Professor extends AnimatedSprite { - - /** - * Geschwindigkeit der Figur in X-Richtung. - */ - private static final int SPRITE_SPEED = 2; - - /** - * Neues Sprite anlegen. - * - * @param board das Spielfeld - * @param startPoint Start-Position - */ - public Professor(Board board, Point startPoint) { - super(board, startPoint, BoundaryPolicy.NONE, - new AnimatedImage(50, 9, - "pr2/enums/use/professor_left")); - velocity.setVelocity(Direction.WEST, SPRITE_SPEED); - } -} diff --git a/sources/src/main/java/pr2/generics/verwenden/GameBoard.java b/sources/src/main/java/pr2/generics/verwenden/GameBoard.java deleted file mode 100644 index 621464b..0000000 --- a/sources/src/main/java/pr2/generics/verwenden/GameBoard.java +++ /dev/null @@ -1,166 +0,0 @@ -package pr2.generics.verwenden; - -import de.smits_net.games.framework.board.Board; -import de.smits_net.games.framework.image.SimpleImage; -import de.smits_net.games.framework.sprite.Sprite; -import de.smits_net.games.framework.sprite.Sprite.BoundaryPolicy; -import de.smits_net.games.framework.sprite.Velocity; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Point; -import java.awt.event.MouseEvent; -import java.util.Random; -import java.util.Stack; - -/** - * Spielfeld. - */ -public class GameBoard extends Board { - - /** - * Zufallszahlengenerator. - */ - private final Random rnd = new Random(); - - /** - * Münzstapel. - */ - // TODO: Münzen als Stack speichern - - /** - * A moving coin. - */ - private Sprite moving; - - /** - * Punkte. - */ - private int points = 0; - - /** - * Zeitpunkt des ersten Klicks. - */ - private long startzeit; - - /** - * Erzeugt ein neues Board. - */ - public GameBoard() { - // neues Spielfeld anlegen - super(10, new Dimension(400, 400), Color.BLACK); - - // Münzen anlegen - for (int i = 0; i < 20; i++) { - // TODO: Neue Münzen auf den Stapel legen - } - } - - /** - * Legt eine zufällige Münze an. - * - * @return die Münze als Sprite. - */ - private Sprite createCoin() { - final String prefix = "pr2/generics/verwendung"; - - String asset; - - switch (rnd.nextInt(8)) { - case 0: - asset = prefix + "/1c.png"; - break; - case 1: - asset = prefix + "/2c.png"; - break; - case 3: - asset = prefix + "/5c.png"; - break; - case 4: - asset = prefix + "/10c.png"; - break; - case 5: - asset = prefix + "/20c.png"; - break; - case 6: - asset = prefix + "/50c.png"; - break; - case 7: - asset = prefix + "/1e.png"; - break; - default: - asset = prefix + "/2e.png"; - break; - } - - int offset = rnd.nextInt(10); - - return new Sprite(this, new Point(100 + offset, 100 + offset), - BoundaryPolicy.NONE, new SimpleImage(asset)); - } - - /** - * Spielfeld neu zeichnen. Wird vom Framework aufgerufen. - */ - @Override - public synchronized void drawGame(Graphics g) { - // TODO: Alle Münzen zeichnen - - if (moving != null) { - moving.draw(g, this); - } - - writeText(g, 0, 20, "Punkte: " + points); - } - - /** - * Spielfeld zeichnen. - * - * @param g Grafik-Kontext. - */ - @Override - protected void drawGameOver(Graphics g) { - centerText(g, String.format("%d Punkte in %.2f Sekunden", points, - (System.currentTimeMillis() - startzeit) / 1000.0)); - } - - /** - * Mausklick abfangen. - * - * @param e Maus-Event. - */ - @Override - public synchronized void mouseClicked(MouseEvent e) { - - if (startzeit == 0) { - startzeit = System.currentTimeMillis(); - } - - // TODO: Wenn Stapel leer ist, nichts tun - - // Oberstes Sprite vom Stapel ansehen und s zuweisen - Sprite s = null; - - if (s.intersects(new Point(e.getX(), e.getY()))) { - points++; - // TODO: Oberstes Sprite vom Stapel entfernen und s zuweisen - moving = s; - moving.setVelocity(new Velocity(0, 20)); - } - } - - /** - * Spielsituation updaten. Wird vom Framework aufgerufen. - */ - @Override - public boolean updateGame() { - - if (moving != null) { - moving.move(); - } - - // TODO: Solange Stapel noch Elemente enthält, true zurückgeben. - return true; - } -} diff --git a/sources/src/main/java/pr2/generics/verwenden/GameMain.java b/sources/src/main/java/pr2/generics/verwenden/GameMain.java deleted file mode 100644 index c305e4a..0000000 --- a/sources/src/main/java/pr2/generics/verwenden/GameMain.java +++ /dev/null @@ -1,28 +0,0 @@ -package pr2.generics.verwenden; - -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 the coins as fast as you can", new GameBoard()); - } - - /** - * Startpunkt. - * - * @param args command line arguments. - */ - public static void main(String[] args) { - // Spiel starten - EventQueue.invokeLater(GameMain::new); - } -} diff --git a/sources/src/main/java/pr2/lambda/static_member/Alien.java b/sources/src/main/java/pr2/lambda/static_member/Alien.java deleted file mode 100644 index 21722ee..0000000 --- a/sources/src/main/java/pr2/lambda/static_member/Alien.java +++ /dev/null @@ -1,54 +0,0 @@ -package pr2.lambda.static_member; - -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(); - } -} diff --git a/sources/src/main/java/pr2/lambda/static_member/GameBoard.java b/sources/src/main/java/pr2/lambda/static_member/GameBoard.java deleted file mode 100644 index 2f4a086..0000000 --- a/sources/src/main/java/pr2/lambda/static_member/GameBoard.java +++ /dev/null @@ -1,68 +0,0 @@ -package pr2.lambda.static_member; - -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 statischen Klasse machen -} diff --git a/sources/src/main/java/pr2/lambda/static_member/GameMain.java b/sources/src/main/java/pr2/lambda/static_member/GameMain.java deleted file mode 100644 index 1011145..0000000 --- a/sources/src/main/java/pr2/lambda/static_member/GameMain.java +++ /dev/null @@ -1,27 +0,0 @@ -package pr2.lambda.static_member; - -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 - (01) Static Member", new GameBoard()); - } - - /** - * Startpunkt. - * - * @param args command line arguments. - */ - public static void main(String[] args) { - EventQueue.invokeLater(GameMain::new); - } -} diff --git a/sources/src/main/resources/pr2/collections/list/kafka.txt b/sources/src/main/resources/pr2/collections/list/kafka.txt index 9aefd2d..b5695c5 100644 --- a/sources/src/main/resources/pr2/collections/list/kafka.txt +++ b/sources/src/main/resources/pr2/collections/list/kafka.txt @@ -1,4 +1,4 @@ -erhaftung - Gespräch mit Frau Grubach - Dann Fräulein Bürstner +Verhaftung - Gespräch mit Frau Grubach - Dann Fräulein Bürstner Jemand mußte Josef K. verleumdet haben, denn ohne daß er etwas Böses getan hätte, wurde er eines Morgens verhaftet. Die Köchin der Frau Grubach, seiner Zimmervermieterin, die ihm jeden Tag gegen acht Uhr früh das Frühstück brachte, kam diesmal nicht. Das war noch niemals geschehen. K. wartete noch ein Weilchen, sah von seinem Kopfkissen aus die alte Frau, die ihm gegenüber wohnte und die ihn mit einer an ihr ganz ungewöhnlichen Neugierde beobachtete, dann aber, gleichzeitig befremdet und hungrig, läutete er. Sofort klopfte es und ein Mann, den er in dieser Wohnung noch niemals gesehen hatte, trat ein. Er war schlank und doch fest gebaut, er trug ein anliegendes schwarzes Kleid, das, ähnlich den Reiseanzügen, mit verschiedenen Falten, Taschen, Schnallen, Knöpfen und einem Gürtel versehen war und infolgedessen, ohne daß man sich darüber klar wurde, wozu es dienen sollte, besonders praktisch erschien. "Wer sind Sie?" fragte K. und saß gleich halb aufrecht im Bett. Der Mann aber ging über die Frage hinweg, als müsse man seine Erscheinung hinnehmen, und sagte bloß seinerseits: "Sie haben geläutet?" "Anna soll mir das Frühstück bringen", sagte K. und versuchte, zunächst stillschweigend, durch Aufmerksamkeit und Überlegung festzustellen, wer der Mann eigentlich war. Aber dieser setzte sich nicht allzulange seinen Blicken aus, sondern wandte sich zur Tür, die er ein wenig öffnete, um jemandem, der offenbar knapp hinter der Tür stand, zu sagen: "Er will, daß Anna ihm das Frühstück bringt." Ein kleines Gelächter im Nebenzimmer folgte, es war nach dem Klang nicht sicher, ob nicht mehrere Personen daran beteiligt waren. Obwohl der fremde Mann dadurch nichts erfahren haben konnte, was er nicht schon früher gewußt hätte, sagte er nun doch zu K. im Tone einer Meldung: "Es ist unmöglich." "Das wäre neu", sagte K., sprang aus dem Bett und zog rasch seine Hosen an. "Ich will doch sehen, was für Leute im Nebenzimmer sind und wie Frau Grubach diese Störung mir gegenüber verantworten wird." Es fiel ihm zwar gleich ein, daß er das nicht hätte laut sagen müssen und daß er dadurch gewissermaßen ein Beaufsichtigungsrecht des Fremden anerkannte, aber es schien ihm jetzt nicht wichtig. Immerhin faßte es der Fremde so auf, denn er sagte: "Wollen Sie nicht lieber hierbleiben?" "Ich will weder hierbleiben, noch von Ihnen angesprochen werden, solange Sie sich mir nicht vorstellen." "Es war gut gemeint", sagte der Fremde und öffnete nun freiwillig die Tür. Im Nebenzimmer, in das K. langsamer eintrat, als er wollte, sah es auf den ersten Blick fast genau so aus wie am Abend vorher. Es war das Wohnzimmer der Frau Grubach, vielleicht war in diesem mit Möbeln, Decken, Porzellan und Photographien überfüllten Zimmer heute ein wenig mehr Raum als sonst, man erkannte das nicht gleich, um so weniger, als die Hauptveränderung in der Anwesenheit eines Mannes bestand, der beim offenen Fenster mit einem Buch saß, von dem er jetzt aufblickte. "Sie hätten in Ihrem Zimmer bleiben sollen! Hat es Ihnen denn Franz nicht gesagt?" "Ja, was wollen Sie denn?" sagte K. und sah von der neuen Bekanntschaft zu dem mit Franz Benannten, der in der Tür stehengeblieben war, und dann wieder zurück. Durch das offene Fenster erblickte man wieder die alte Frau, die mit wahrhaft greisenhafter Neugierde zu dem jetzt gegenüberliegenden Fenster getreten war, um auch weiterhin alles zu sehen. "Ich will doch Frau Grubach -", sagte K., machte eine Bewegung, als reiße er sich von den zwei Männern los, die aber weit von ihm entfernt standen, und wollte weitergehen. "Nein", sagte der Mann beim Fenster, warf das Buch auf ein Tischchen und stand auf. "Sie dürfen nicht weggehen, Sie sind ja verhaftet." "Es sieht so aus", sagte K. "Und warum denn?" fragte er dann. "Wir sind nicht dazu bestellt, Ihnen das zu sagen. Gehen Sie in Ihr Zimmer und warten Sie. Das Verfahren ist nun einmal eingeleitet, und Sie werden alles zur richtigen Zeit erfahren. Ich gehe über meinen Auftrag hinaus, wenn ich Ihnen so freundschaftlich zurede. Aber ich hoffe, es hört es niemand sonst als Franz, und der ist selbst gegen alle Vorschrift freundlich zu Ihnen. Wenn Sie auch weiterhin so viel Glück haben wie bei der Bestimmung Ihrer Wächter, dann können Sie zuversichtlich sein." K. wollte sich setzen, aber nun sah er, daß im ganzen Zimmer keine Sitzgelegenheit war, außer dem Sessel beim Fenster. "Sie werden noch einsehen, wie wahr das alles ist", sagte Franz und ging gleichzeitig mit dem andern Mann auf ihn zu. Besonders der letztere überragte K. bedeutend und klopfte ihm öfters auf die Schulter. Beide prüften K.s Nachthemd und sagten, daß er jetzt ein viel schlechteres Hemd werde anziehen müssen, daß sie aber dieses Hemd wie auch seine übrige Wäsche aufbewahren und, wenn seine Sache günstig ausfallen sollte, ihm wieder zurückgeben würden. "Es ist besser, Sie geben die Sachen uns als ins Depot", sagten sie, "denn im Depot kommen öfters Unterschleife vor und außerdem verkauft man dort alle Sachen nach einer gewissen Zeit, ohne Rücksicht, ob das betreffende Verfahren zu Ende ist oder nicht. Und wie lange dauern doch derartige Prozesse, besonders in letzter Zeit! Sie bekämen dann schließlich allerdings vom Depot den Erlös, aber dieser Erlös ist erstens an sich schon gering, denn beim Verkauf entscheidet nicht die Höhe des Angebotes, sondern die Höhe der Bestechung, und weiter verringern sich solche Erlöse erfahrungsgemäß, wenn sie von Hand zu Hand und von Jahr zu Jahr weitergegeben werden." K. achtete auf diese Reden kaum, das Verfügungsrecht über seine Sachen, das er vielleicht noch besaß, schätzte er nicht hoch ein, viel wichtiger war es ihm, Klarheit über seine Lage zu bekommen; in Gegenwart dieser Leute konnte er aber nicht einmal nachdenken, immer wieder stieß der Bauch des zweiten Wächters - es konnten ja nur Wächter sein - förmlich freundschaftlich an ihn, sah er aber auf, dann erblickte er ein zu diesem dicken Körper gar nicht passendes trockenes, knochiges Gesicht mit starker, seitlich gedrehter Nase, das sich über ihn hinweg mit dem anderen Wächter verständigte. Was waren denn das für Menschen? Wovon sprachen sie? Welcher Behörde gehörten sie an? K. lebte doch in einem Rechtsstaat, überall herrschte Friede, alle Gesetze bestanden aufrecht, wer wagte, ihn in seiner Wohnung zu überfallen? Er neigte stets dazu, alles möglichst leicht zu nehmen, das Schlimmste erst beim Eintritt des Schlimmsten zu glauben, keine Vorsorge für die Zukunft zu treffen, selbst wenn alles drohte. Hier schien ihm das aber nicht richtig, man konnte zwar das Ganze als Spaß ansehen, als einen groben Spaß, den ihm aus unbekannten Gründen, vielleicht weil heute sein dreißigster Geburtstag war, die Kollegen in der Bank veranstaltet hatten, es war natürlich möglich, vielleicht brauchte er nur auf irgendeine Weise den Wächtern ins Gesicht zu lachen, und sie würden mitlachen, vielleicht waren es Dienstmänner von der Straßenecke, sie sahen ihnen nicht unähnlich - trotzdem war er diesmal, förmlich schon seit dem ersten Anblick des Wächters Franz, entschlossen, nicht den geringsten Vorteil, den er vielleicht gegenüber diesen Leuten besaß, aus der Hand zu geben. Darin, daß man später sagen würde, er habe keinen Spaß verstanden, sah K. eine ganz geringe Gefahr, wohl aber erinnerte er sich - ohne daß es sonst seine Gewohnheit gewesen wäre, aus Erfahrungen zu lernen - an einige, an sich unbedeutende Fälle, in denen er zum Unterschied von seinen Freunden mit Bewußtsein, ohne das geringste Gefühl für die möglichen Folgen, sich unvorsichtig benommen hatte und dafür durch das Ergebnis gestraft worden war. Es sollte nicht wieder geschehen, zumindest nicht diesmal; war es eine Komödie, so wollte er mitspielen. diff --git a/sources/src/main/resources/pr2/collections/map/kafka.txt b/sources/src/main/resources/pr2/collections/map/kafka.txt index 9aefd2d..b5695c5 100644 --- a/sources/src/main/resources/pr2/collections/map/kafka.txt +++ b/sources/src/main/resources/pr2/collections/map/kafka.txt @@ -1,4 +1,4 @@ -erhaftung - Gespräch mit Frau Grubach - Dann Fräulein Bürstner +Verhaftung - Gespräch mit Frau Grubach - Dann Fräulein Bürstner Jemand mußte Josef K. verleumdet haben, denn ohne daß er etwas Böses getan hätte, wurde er eines Morgens verhaftet. Die Köchin der Frau Grubach, seiner Zimmervermieterin, die ihm jeden Tag gegen acht Uhr früh das Frühstück brachte, kam diesmal nicht. Das war noch niemals geschehen. K. wartete noch ein Weilchen, sah von seinem Kopfkissen aus die alte Frau, die ihm gegenüber wohnte und die ihn mit einer an ihr ganz ungewöhnlichen Neugierde beobachtete, dann aber, gleichzeitig befremdet und hungrig, läutete er. Sofort klopfte es und ein Mann, den er in dieser Wohnung noch niemals gesehen hatte, trat ein. Er war schlank und doch fest gebaut, er trug ein anliegendes schwarzes Kleid, das, ähnlich den Reiseanzügen, mit verschiedenen Falten, Taschen, Schnallen, Knöpfen und einem Gürtel versehen war und infolgedessen, ohne daß man sich darüber klar wurde, wozu es dienen sollte, besonders praktisch erschien. "Wer sind Sie?" fragte K. und saß gleich halb aufrecht im Bett. Der Mann aber ging über die Frage hinweg, als müsse man seine Erscheinung hinnehmen, und sagte bloß seinerseits: "Sie haben geläutet?" "Anna soll mir das Frühstück bringen", sagte K. und versuchte, zunächst stillschweigend, durch Aufmerksamkeit und Überlegung festzustellen, wer der Mann eigentlich war. Aber dieser setzte sich nicht allzulange seinen Blicken aus, sondern wandte sich zur Tür, die er ein wenig öffnete, um jemandem, der offenbar knapp hinter der Tür stand, zu sagen: "Er will, daß Anna ihm das Frühstück bringt." Ein kleines Gelächter im Nebenzimmer folgte, es war nach dem Klang nicht sicher, ob nicht mehrere Personen daran beteiligt waren. Obwohl der fremde Mann dadurch nichts erfahren haben konnte, was er nicht schon früher gewußt hätte, sagte er nun doch zu K. im Tone einer Meldung: "Es ist unmöglich." "Das wäre neu", sagte K., sprang aus dem Bett und zog rasch seine Hosen an. "Ich will doch sehen, was für Leute im Nebenzimmer sind und wie Frau Grubach diese Störung mir gegenüber verantworten wird." Es fiel ihm zwar gleich ein, daß er das nicht hätte laut sagen müssen und daß er dadurch gewissermaßen ein Beaufsichtigungsrecht des Fremden anerkannte, aber es schien ihm jetzt nicht wichtig. Immerhin faßte es der Fremde so auf, denn er sagte: "Wollen Sie nicht lieber hierbleiben?" "Ich will weder hierbleiben, noch von Ihnen angesprochen werden, solange Sie sich mir nicht vorstellen." "Es war gut gemeint", sagte der Fremde und öffnete nun freiwillig die Tür. Im Nebenzimmer, in das K. langsamer eintrat, als er wollte, sah es auf den ersten Blick fast genau so aus wie am Abend vorher. Es war das Wohnzimmer der Frau Grubach, vielleicht war in diesem mit Möbeln, Decken, Porzellan und Photographien überfüllten Zimmer heute ein wenig mehr Raum als sonst, man erkannte das nicht gleich, um so weniger, als die Hauptveränderung in der Anwesenheit eines Mannes bestand, der beim offenen Fenster mit einem Buch saß, von dem er jetzt aufblickte. "Sie hätten in Ihrem Zimmer bleiben sollen! Hat es Ihnen denn Franz nicht gesagt?" "Ja, was wollen Sie denn?" sagte K. und sah von der neuen Bekanntschaft zu dem mit Franz Benannten, der in der Tür stehengeblieben war, und dann wieder zurück. Durch das offene Fenster erblickte man wieder die alte Frau, die mit wahrhaft greisenhafter Neugierde zu dem jetzt gegenüberliegenden Fenster getreten war, um auch weiterhin alles zu sehen. "Ich will doch Frau Grubach -", sagte K., machte eine Bewegung, als reiße er sich von den zwei Männern los, die aber weit von ihm entfernt standen, und wollte weitergehen. "Nein", sagte der Mann beim Fenster, warf das Buch auf ein Tischchen und stand auf. "Sie dürfen nicht weggehen, Sie sind ja verhaftet." "Es sieht so aus", sagte K. "Und warum denn?" fragte er dann. "Wir sind nicht dazu bestellt, Ihnen das zu sagen. Gehen Sie in Ihr Zimmer und warten Sie. Das Verfahren ist nun einmal eingeleitet, und Sie werden alles zur richtigen Zeit erfahren. Ich gehe über meinen Auftrag hinaus, wenn ich Ihnen so freundschaftlich zurede. Aber ich hoffe, es hört es niemand sonst als Franz, und der ist selbst gegen alle Vorschrift freundlich zu Ihnen. Wenn Sie auch weiterhin so viel Glück haben wie bei der Bestimmung Ihrer Wächter, dann können Sie zuversichtlich sein." K. wollte sich setzen, aber nun sah er, daß im ganzen Zimmer keine Sitzgelegenheit war, außer dem Sessel beim Fenster. "Sie werden noch einsehen, wie wahr das alles ist", sagte Franz und ging gleichzeitig mit dem andern Mann auf ihn zu. Besonders der letztere überragte K. bedeutend und klopfte ihm öfters auf die Schulter. Beide prüften K.s Nachthemd und sagten, daß er jetzt ein viel schlechteres Hemd werde anziehen müssen, daß sie aber dieses Hemd wie auch seine übrige Wäsche aufbewahren und, wenn seine Sache günstig ausfallen sollte, ihm wieder zurückgeben würden. "Es ist besser, Sie geben die Sachen uns als ins Depot", sagten sie, "denn im Depot kommen öfters Unterschleife vor und außerdem verkauft man dort alle Sachen nach einer gewissen Zeit, ohne Rücksicht, ob das betreffende Verfahren zu Ende ist oder nicht. Und wie lange dauern doch derartige Prozesse, besonders in letzter Zeit! Sie bekämen dann schließlich allerdings vom Depot den Erlös, aber dieser Erlös ist erstens an sich schon gering, denn beim Verkauf entscheidet nicht die Höhe des Angebotes, sondern die Höhe der Bestechung, und weiter verringern sich solche Erlöse erfahrungsgemäß, wenn sie von Hand zu Hand und von Jahr zu Jahr weitergegeben werden." K. achtete auf diese Reden kaum, das Verfügungsrecht über seine Sachen, das er vielleicht noch besaß, schätzte er nicht hoch ein, viel wichtiger war es ihm, Klarheit über seine Lage zu bekommen; in Gegenwart dieser Leute konnte er aber nicht einmal nachdenken, immer wieder stieß der Bauch des zweiten Wächters - es konnten ja nur Wächter sein - förmlich freundschaftlich an ihn, sah er aber auf, dann erblickte er ein zu diesem dicken Körper gar nicht passendes trockenes, knochiges Gesicht mit starker, seitlich gedrehter Nase, das sich über ihn hinweg mit dem anderen Wächter verständigte. Was waren denn das für Menschen? Wovon sprachen sie? Welcher Behörde gehörten sie an? K. lebte doch in einem Rechtsstaat, überall herrschte Friede, alle Gesetze bestanden aufrecht, wer wagte, ihn in seiner Wohnung zu überfallen? Er neigte stets dazu, alles möglichst leicht zu nehmen, das Schlimmste erst beim Eintritt des Schlimmsten zu glauben, keine Vorsorge für die Zukunft zu treffen, selbst wenn alles drohte. Hier schien ihm das aber nicht richtig, man konnte zwar das Ganze als Spaß ansehen, als einen groben Spaß, den ihm aus unbekannten Gründen, vielleicht weil heute sein dreißigster Geburtstag war, die Kollegen in der Bank veranstaltet hatten, es war natürlich möglich, vielleicht brauchte er nur auf irgendeine Weise den Wächtern ins Gesicht zu lachen, und sie würden mitlachen, vielleicht waren es Dienstmänner von der Straßenecke, sie sahen ihnen nicht unähnlich - trotzdem war er diesmal, förmlich schon seit dem ersten Anblick des Wächters Franz, entschlossen, nicht den geringsten Vorteil, den er vielleicht gegenüber diesen Leuten besaß, aus der Hand zu geben. Darin, daß man später sagen würde, er habe keinen Spaß verstanden, sah K. eine ganz geringe Gefahr, wohl aber erinnerte er sich - ohne daß es sonst seine Gewohnheit gewesen wäre, aus Erfahrungen zu lernen - an einige, an sich unbedeutende Fälle, in denen er zum Unterschied von seinen Freunden mit Bewußtsein, ohne das geringste Gefühl für die möglichen Folgen, sich unvorsichtig benommen hatte und dafür durch das Ergebnis gestraft worden war. Es sollte nicht wieder geschehen, zumindest nicht diesmal; war es eine Komödie, so wollte er mitspielen. diff --git a/sources/src/main/resources/pr2/collections/set/kafka.txt b/sources/src/main/resources/pr2/collections/set/kafka.txt index 9aefd2d..b5695c5 100644 --- a/sources/src/main/resources/pr2/collections/set/kafka.txt +++ b/sources/src/main/resources/pr2/collections/set/kafka.txt @@ -1,4 +1,4 @@ -erhaftung - Gespräch mit Frau Grubach - Dann Fräulein Bürstner +Verhaftung - Gespräch mit Frau Grubach - Dann Fräulein Bürstner Jemand mußte Josef K. verleumdet haben, denn ohne daß er etwas Böses getan hätte, wurde er eines Morgens verhaftet. Die Köchin der Frau Grubach, seiner Zimmervermieterin, die ihm jeden Tag gegen acht Uhr früh das Frühstück brachte, kam diesmal nicht. Das war noch niemals geschehen. K. wartete noch ein Weilchen, sah von seinem Kopfkissen aus die alte Frau, die ihm gegenüber wohnte und die ihn mit einer an ihr ganz ungewöhnlichen Neugierde beobachtete, dann aber, gleichzeitig befremdet und hungrig, läutete er. Sofort klopfte es und ein Mann, den er in dieser Wohnung noch niemals gesehen hatte, trat ein. Er war schlank und doch fest gebaut, er trug ein anliegendes schwarzes Kleid, das, ähnlich den Reiseanzügen, mit verschiedenen Falten, Taschen, Schnallen, Knöpfen und einem Gürtel versehen war und infolgedessen, ohne daß man sich darüber klar wurde, wozu es dienen sollte, besonders praktisch erschien. "Wer sind Sie?" fragte K. und saß gleich halb aufrecht im Bett. Der Mann aber ging über die Frage hinweg, als müsse man seine Erscheinung hinnehmen, und sagte bloß seinerseits: "Sie haben geläutet?" "Anna soll mir das Frühstück bringen", sagte K. und versuchte, zunächst stillschweigend, durch Aufmerksamkeit und Überlegung festzustellen, wer der Mann eigentlich war. Aber dieser setzte sich nicht allzulange seinen Blicken aus, sondern wandte sich zur Tür, die er ein wenig öffnete, um jemandem, der offenbar knapp hinter der Tür stand, zu sagen: "Er will, daß Anna ihm das Frühstück bringt." Ein kleines Gelächter im Nebenzimmer folgte, es war nach dem Klang nicht sicher, ob nicht mehrere Personen daran beteiligt waren. Obwohl der fremde Mann dadurch nichts erfahren haben konnte, was er nicht schon früher gewußt hätte, sagte er nun doch zu K. im Tone einer Meldung: "Es ist unmöglich." "Das wäre neu", sagte K., sprang aus dem Bett und zog rasch seine Hosen an. "Ich will doch sehen, was für Leute im Nebenzimmer sind und wie Frau Grubach diese Störung mir gegenüber verantworten wird." Es fiel ihm zwar gleich ein, daß er das nicht hätte laut sagen müssen und daß er dadurch gewissermaßen ein Beaufsichtigungsrecht des Fremden anerkannte, aber es schien ihm jetzt nicht wichtig. Immerhin faßte es der Fremde so auf, denn er sagte: "Wollen Sie nicht lieber hierbleiben?" "Ich will weder hierbleiben, noch von Ihnen angesprochen werden, solange Sie sich mir nicht vorstellen." "Es war gut gemeint", sagte der Fremde und öffnete nun freiwillig die Tür. Im Nebenzimmer, in das K. langsamer eintrat, als er wollte, sah es auf den ersten Blick fast genau so aus wie am Abend vorher. Es war das Wohnzimmer der Frau Grubach, vielleicht war in diesem mit Möbeln, Decken, Porzellan und Photographien überfüllten Zimmer heute ein wenig mehr Raum als sonst, man erkannte das nicht gleich, um so weniger, als die Hauptveränderung in der Anwesenheit eines Mannes bestand, der beim offenen Fenster mit einem Buch saß, von dem er jetzt aufblickte. "Sie hätten in Ihrem Zimmer bleiben sollen! Hat es Ihnen denn Franz nicht gesagt?" "Ja, was wollen Sie denn?" sagte K. und sah von der neuen Bekanntschaft zu dem mit Franz Benannten, der in der Tür stehengeblieben war, und dann wieder zurück. Durch das offene Fenster erblickte man wieder die alte Frau, die mit wahrhaft greisenhafter Neugierde zu dem jetzt gegenüberliegenden Fenster getreten war, um auch weiterhin alles zu sehen. "Ich will doch Frau Grubach -", sagte K., machte eine Bewegung, als reiße er sich von den zwei Männern los, die aber weit von ihm entfernt standen, und wollte weitergehen. "Nein", sagte der Mann beim Fenster, warf das Buch auf ein Tischchen und stand auf. "Sie dürfen nicht weggehen, Sie sind ja verhaftet." "Es sieht so aus", sagte K. "Und warum denn?" fragte er dann. "Wir sind nicht dazu bestellt, Ihnen das zu sagen. Gehen Sie in Ihr Zimmer und warten Sie. Das Verfahren ist nun einmal eingeleitet, und Sie werden alles zur richtigen Zeit erfahren. Ich gehe über meinen Auftrag hinaus, wenn ich Ihnen so freundschaftlich zurede. Aber ich hoffe, es hört es niemand sonst als Franz, und der ist selbst gegen alle Vorschrift freundlich zu Ihnen. Wenn Sie auch weiterhin so viel Glück haben wie bei der Bestimmung Ihrer Wächter, dann können Sie zuversichtlich sein." K. wollte sich setzen, aber nun sah er, daß im ganzen Zimmer keine Sitzgelegenheit war, außer dem Sessel beim Fenster. "Sie werden noch einsehen, wie wahr das alles ist", sagte Franz und ging gleichzeitig mit dem andern Mann auf ihn zu. Besonders der letztere überragte K. bedeutend und klopfte ihm öfters auf die Schulter. Beide prüften K.s Nachthemd und sagten, daß er jetzt ein viel schlechteres Hemd werde anziehen müssen, daß sie aber dieses Hemd wie auch seine übrige Wäsche aufbewahren und, wenn seine Sache günstig ausfallen sollte, ihm wieder zurückgeben würden. "Es ist besser, Sie geben die Sachen uns als ins Depot", sagten sie, "denn im Depot kommen öfters Unterschleife vor und außerdem verkauft man dort alle Sachen nach einer gewissen Zeit, ohne Rücksicht, ob das betreffende Verfahren zu Ende ist oder nicht. Und wie lange dauern doch derartige Prozesse, besonders in letzter Zeit! Sie bekämen dann schließlich allerdings vom Depot den Erlös, aber dieser Erlös ist erstens an sich schon gering, denn beim Verkauf entscheidet nicht die Höhe des Angebotes, sondern die Höhe der Bestechung, und weiter verringern sich solche Erlöse erfahrungsgemäß, wenn sie von Hand zu Hand und von Jahr zu Jahr weitergegeben werden." K. achtete auf diese Reden kaum, das Verfügungsrecht über seine Sachen, das er vielleicht noch besaß, schätzte er nicht hoch ein, viel wichtiger war es ihm, Klarheit über seine Lage zu bekommen; in Gegenwart dieser Leute konnte er aber nicht einmal nachdenken, immer wieder stieß der Bauch des zweiten Wächters - es konnten ja nur Wächter sein - förmlich freundschaftlich an ihn, sah er aber auf, dann erblickte er ein zu diesem dicken Körper gar nicht passendes trockenes, knochiges Gesicht mit starker, seitlich gedrehter Nase, das sich über ihn hinweg mit dem anderen Wächter verständigte. Was waren denn das für Menschen? Wovon sprachen sie? Welcher Behörde gehörten sie an? K. lebte doch in einem Rechtsstaat, überall herrschte Friede, alle Gesetze bestanden aufrecht, wer wagte, ihn in seiner Wohnung zu überfallen? Er neigte stets dazu, alles möglichst leicht zu nehmen, das Schlimmste erst beim Eintritt des Schlimmsten zu glauben, keine Vorsorge für die Zukunft zu treffen, selbst wenn alles drohte. Hier schien ihm das aber nicht richtig, man konnte zwar das Ganze als Spaß ansehen, als einen groben Spaß, den ihm aus unbekannten Gründen, vielleicht weil heute sein dreißigster Geburtstag war, die Kollegen in der Bank veranstaltet hatten, es war natürlich möglich, vielleicht brauchte er nur auf irgendeine Weise den Wächtern ins Gesicht zu lachen, und sie würden mitlachen, vielleicht waren es Dienstmänner von der Straßenecke, sie sahen ihnen nicht unähnlich - trotzdem war er diesmal, förmlich schon seit dem ersten Anblick des Wächters Franz, entschlossen, nicht den geringsten Vorteil, den er vielleicht gegenüber diesen Leuten besaß, aus der Hand zu geben. Darin, daß man später sagen würde, er habe keinen Spaß verstanden, sah K. eine ganz geringe Gefahr, wohl aber erinnerte er sich - ohne daß es sonst seine Gewohnheit gewesen wäre, aus Erfahrungen zu lernen - an einige, an sich unbedeutende Fälle, in denen er zum Unterschied von seinen Freunden mit Bewußtsein, ohne das geringste Gefühl für die möglichen Folgen, sich unvorsichtig benommen hatte und dafür durch das Ergebnis gestraft worden war. Es sollte nicht wieder geschehen, zumindest nicht diesmal; war es eine Komödie, so wollte er mitspielen. diff --git a/sources/src/main/resources/pr2/streams/reduce/games.txt b/sources/src/main/resources/pr2/streams/reduce_critics/games.txt similarity index 100% rename from sources/src/main/resources/pr2/streams/reduce/games.txt rename to sources/src/main/resources/pr2/streams/reduce_critics/games.txt