Update of exercises

main
Thomas Smits 2026-06-10 18:54:45 +02:00
parent 4c324974f3
commit 8ac6e0a1e9
17 changed files with 388 additions and 111 deletions

View File

@ -0,0 +1,26 @@
# Eigene compare-Methode schreiben
## Lernziel
[Musterlösung](solution/)
Objekte vergleichen.
## Aufgabe
Gehen Sie in das Paket [pr2.lambda.array_sorter](../sources/src/main/java/pr2/lambda/array_sorter/).
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)
__Sie müssen keine Lösung für diese Aufgabe einreichen.__
Sie können Ihre Lösung aber auf die Konformität mit den Programmierstandards testen. Hierzu gehen Sie wie folgt vor:
1. Öffnen Sie eine Kommandozeile (Terminal).
2. Gehen Sie in Ihr Working Directory.
3. Wechseln Sie mit `cd` in das Verzeichnis `sources`.
4. Bauen Sie das Projekt mit dem Kommando `mvn`.
-->

View File

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

View File

@ -0,0 +1,30 @@
# Innere Klasse Beobachter
## Lernziel
[Musterlösung](solution/)
Zugriff von inneren Klassen auf die umgebende Klasse.
## Aufgabe
Gehen Sie in das Paket: [pr2.lambda.observer](../sources/src/main/java/pr2/lambda/observer/).
Dort finden Sie das Interface `Beobachter`.
Schreiben Sie eine Klasse `Datenhalter`, die eine einziges, privates Attribut vom Typ `int` enthält. Setzen Sie das Attribut im Konstruktor, erzeugen Sie aber keinen Getter.
Implementieren Sie das Interface `Beobachter` als nicht-statische, private innere Klasse in `Datenhalter` und erlauben Sie über den Beobachter Zugriff auf das Attribut, indem Sie ein entsprechendes Objekt vom Typ `Beobachter` zurückgeben. Testen Sie Ihre Implementierung mit einem JUnit-Test.
<!--
## Abgabe (optional)
__Sie müssen keine Lösung für diese Aufgabe einreichen.__
Sie können Ihre Lösung aber auf die Konformität mit den Programmierstandards testen. Hierzu gehen Sie wie folgt vor:
1. Öffnen Sie eine Kommandozeile (Terminal).
2. Gehen Sie in Ihr Working Directory.
3. Wechseln Sie mit `cd` in das Verzeichnis `sources`.
4. Bauen Sie das Projekt mit dem Kommando `mvn`.
-->

View File

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

View File

@ -0,0 +1,30 @@
# Callback mit anonymer Klasse realisieren
## Lernziel
[Musterlösung](solution/)
Eine gegebene Funktion durch einen Callback parametrieren. Der Callback wird als anonyme innere Klasse realisiert.
## Aufgabe
Gehen Sie in das Paket [pr2.lambda.callback](../sources/src/main/java/pr2/lambda/callback/).
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)
__Sie müssen keine Lösung für diese Aufgabe einreichen.__
Sie können Ihre Lösung aber auf die Konformität mit den Programmierstandards testen. Hierzu gehen Sie wie folgt vor:
1. Öffnen Sie eine Kommandozeile (Terminal).
2. Gehen Sie in Ihr Working Directory.
3. Wechseln Sie mit `cd` in das Verzeichnis `sources`.
4. Bauen Sie das Projekt mit dem Kommando `mvn`.
-->

View File

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

View File

@ -0,0 +1,29 @@
# Comparator als Lambda
## Lernziel
[Musterlösung](solution/)
Lambdas verwenden.
## Aufgabe
Gehen Sie in das Paket
[pr2.lambda.comparator](../sources/src/main/java/pr2/lambda/comparator/).
Als Teil der Java-Klassenbibliothek findet sich das Interface `Comparator`, mit dem beim Sortieren eine Sortierreihenfolge vorgeben werden kann. Da es sich um ein funktionales Interface handelt, kann man es auch mit einem Lambda-Ausdruck implementieren. Schauen Sie sich den Aufbau des Interfaces in der Javadoc an.
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)
__Sie müssen keine Lösung für diese Aufgabe einreichen.__
Sie können Ihre Lösung aber auf die Konformität mit den Programmierstandards testen. Hierzu gehen Sie wie folgt vor:
1. Öffnen Sie eine Kommandozeile (Terminal).
2. Gehen Sie in Ihr Working Directory.
3. Wechseln Sie mit `cd` in das Verzeichnis `sources`.
4. Bauen Sie das Projekt mit dem Kommando `mvn`.
-->

View File

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

View File

@ -0,0 +1,32 @@
# Callback mit Lambda realisieren
## Lernziel
[Musterlösung](solution/)
Eine gegebene Funktion durch einen Callback parametrieren. Der Callback wird als Lambda realisiert.
## Aufgabe
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 `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)
__Sie müssen keine Lösung für diese Aufgabe einreichen.__
Sie können Ihre Lösung aber auf die Konformität mit den Programmierstandards testen. Hierzu gehen Sie wie folgt vor:
1. Öffnen Sie eine Kommandozeile (Terminal).
2. Gehen Sie in Ihr Working Directory.
3. Wechseln Sie mit `cd` in das Verzeichnis `sources`.
4. Bauen Sie das Projekt mit dem Kommando `mvn`.
-->

View File

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

View File

@ -0,0 +1,28 @@
# MatrixSuche
## Lernziel
[Musterlösung](solution/)
Statische innere Klassen einsetzen.
## Aufgabe
Gehen Sie in das Paket [pr2.lambda.matrixsuche](../sources/src/main/java/pr2/lambda/matrixsuche/).
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.
Überschreiben Sie die `toString`-Methode in `Position` und testen Sie, ob Ihre Implementierung richtig funktioniert.
<!--
## Abgabe (optional)
__Sie müssen keine Lösung für diese Aufgabe einreichen.__
Sie können Ihre Lösung aber auf die Konformität mit den Programmierstandards testen. Hierzu gehen Sie wie folgt vor:
1. Öffnen Sie eine Kommandozeile (Terminal).
2. Gehen Sie in Ihr Working Directory.
3. Wechseln Sie mit `cd` in das Verzeichnis `sources`.
4. Bauen Sie das Projekt mit dem Kommando `mvn`.
-->

View File

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

View File

@ -0,0 +1,34 @@
# StringTransmogrifier
## Lernziel
[Musterlösung](solution/)
Funktionale Interfaces entwerfen und verwenden.
## Aufgabe
Gehen Sie in das Paket [pr2.lambda.mogrifier_1](../sources/src/main/java/pr2/lambda/mogrifier_1/).
Schreiben Sie ein funktionales Interface namens `StringFunction`. Die Methode des Interfaces nimmt eine String und gibt einen String zurück.
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.
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.
<!--
## Abgabe (optional)
__Sie müssen keine Lösung für diese Aufgabe einreichen.__
Sie können Ihre Lösung aber auf die Konformität mit den Programmierstandards testen. Hierzu gehen Sie wie folgt vor:
1. Öffnen Sie eine Kommandozeile (Terminal).
2. Gehen Sie in Ihr Working Directory.
3. Wechseln Sie mit `cd` in das Verzeichnis `sources`.
4. Bauen Sie das Projekt mit dem Kommando `mvn`.
-->

View File

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

View File

@ -0,0 +1,28 @@
# StringTransmogrifier erweitern
## Lernziel
[Musterlösung](solution/)
Funktionale Interfaces entwerfen und verwenden.
## Aufgabe
Gehen Sie in das Paket [pr2.lambda.mogrifier_2](../sources/src/main/java/pr2/lambda/mogrifier_2/).
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`.
<!--
## Abgabe (optional)
__Sie müssen keine Lösung für diese Aufgabe einreichen.__
Sie können Ihre Lösung aber auf die Konformität mit den Programmierstandards testen. Hierzu gehen Sie wie folgt vor:
1. Öffnen Sie eine Kommandozeile (Terminal).
2. Gehen Sie in Ihr Working Directory.
3. Wechseln Sie mit `cd` in das Verzeichnis `sources`.
4. Bauen Sie das Projekt mit dem Kommando `mvn`.
-->

View File

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

View File

@ -11,7 +11,7 @@ Hier finden Sie die **freiwilligen Übungen** zur Vorlesung Programmieren 2 (PR2
Hinweise zur nötigen Softwareausstattung finden Sie [hier](help/softwareausstattung.md).
| # | Kapitel | Thema | Musterlösung |
|-----|-----------------------|---------------------------------------------------------------------------------------------------|----------------|
|-----|-------------------------------|---------------------------------------------------------------------------------------------------|----------------|
| 1. | Auffrischung | [String in Großbuchstaben umwandeln](Auffrischung_001/readme.md) | [](Auffrischung_001/solution/) |
| 2. | Auffrischung | [Labeled Break](Auffrischung_002/readme.md) | [](Auffrischung_002/solution/) |
| 3. | Auffrischung | [Passwortbewertung](Auffrischung_003/readme.md) | [](Auffrischung_003/solution/) |
@ -82,14 +82,14 @@ Hinweise zur nötigen Softwareausstattung finden Sie [hier](help/softwareausstat
| 68. | Generische Typen | [Generische Queue](Generische_Typen_007/readme.md) | [](Generische_Typen_007/solution/) |
| 69. | Generische Typen | [`super` und `extends` einsetzen](Generische_Typen_008/readme.md) | [](Generische_Typen_008/solution/) |
| 70. | Generische Typen | [Generische Typen zusammen mit Wildcards einsetzen](Generische_Typen_009/readme.md) | [](Generische_Typen_009/solution/) |
| 71. | Geschachtelte Klassen | [Eigene compare-Methode schreiben](Geschachtelte_Klassen_001/readme.md) | [](Geschachtelte_Klassen_001/solution/) |
| 72. | Geschachtelte Klassen | [Innere Klasse Beobachter](Geschachtelte_Klassen_002/readme.md) | [](Geschachtelte_Klassen_002/solution/) |
| 73. | Geschachtelte Klassen | [Callback mit anonymer Klasse realisieren](Geschachtelte_Klassen_003/readme.md) | [](Geschachtelte_Klassen_003/solution/) |
| 74. | Lambdas | [Comparator als Lambda](Lambdas_001/readme.md) | [](Lambdas_001/solution/) |
| 75. | Lambdas | [Callback mit Lambda realisieren](Lambdas_002/readme.md) | [](Lambdas_002/solution/) |
| 76. | Geschachtelte Klassen | [MatrixSuche](Geschachtelte_Klassen_001/readme.md) | [](Geschachtelte_Klassen_001/solution/) |
| 77. | Lambdas | [StringTransmogrifier](Lambdas_001/readme.md) | [](Lambdas_001/solution/) |
| 78. | Lambdas | [StringTransmogrifier erweitern](Lambdas_002/readme.md) | [](Lambdas_002/solution/) |
| 71. | Geschachtelte Klassen/Lambdas | [Eigene compare-Methode schreiben](Geschachtelte_Klassen/Lambdas_001/readme.md) | [](Geschachtelte_Klassen/Lambdas_001/solution/) |
| 72. | Geschachtelte Klassen/Lambdas | [Innere Klasse Beobachter](Geschachtelte_Klassen/Lambdas_002/readme.md) | [](Geschachtelte_Klassen/Lambdas_002/solution/) |
| 73. | Geschachtelte Klassen/Lambdas | [Callback mit anonymer Klasse realisieren](Geschachtelte_Klassen/Lambdas_003/readme.md) | [](Geschachtelte_Klassen/Lambdas_003/solution/) |
| 74. | Geschachtelte Klassen/Lambdas | [Comparator als Lambda](Geschachtelte_Klassen/Lambdas_004/readme.md) | [](Geschachtelte_Klassen/Lambdas_004/solution/) |
| 75. | Geschachtelte Klassen/Lambdas | [Callback mit Lambda realisieren](Geschachtelte_Klassen/Lambdas_005/readme.md) | [](Geschachtelte_Klassen/Lambdas_005/solution/) |
| 76. | Geschachtelte Klassen/Lambdas | [MatrixSuche](Geschachtelte_Klassen/Lambdas_006/readme.md) | [](Geschachtelte_Klassen/Lambdas_006/solution/) |
| 77. | Geschachtelte Klassen/Lambdas | [StringTransmogrifier](Geschachtelte_Klassen/Lambdas_007/readme.md) | [](Geschachtelte_Klassen/Lambdas_007/solution/) |
| 78. | Geschachtelte Klassen/Lambdas | [StringTransmogrifier erweitern](Geschachtelte_Klassen/Lambdas_008/readme.md) | [](Geschachtelte_Klassen/Lambdas_008/solution/) |
| 79. | Collections | [Iterator schreiben](Collections_001/readme.md) | [](Collections_001/solution/) |
| 80. | Collections | [Iterator programmieren](Collections_002/readme.md) | [](Collections_002/solution/) |
| 81. | Collections | [`List<T>` und dessen Implementierungen](Collections_003/readme.md) | [](Collections_003/solution/) |