diff --git a/Geschachtelte_Klassen/Lambdas_001/readme.md b/Geschachtelte_Klassen/Lambdas_001/readme.md new file mode 100644 index 0000000..01b2221 --- /dev/null +++ b/Geschachtelte_Klassen/Lambdas_001/readme.md @@ -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. + + + \ No newline at end of file diff --git a/Geschachtelte_Klassen/Lambdas_001/solution/readme.md b/Geschachtelte_Klassen/Lambdas_001/solution/readme.md new file mode 100644 index 0000000..183c8af --- /dev/null +++ b/Geschachtelte_Klassen/Lambdas_001/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Eigene compare-Methode schreiben + +Musterlösung: + +[pr2.lambda.array_sorter](../../solutions/src/main/java/pr2/lambda/array_sorter/) diff --git a/Geschachtelte_Klassen/Lambdas_002/readme.md b/Geschachtelte_Klassen/Lambdas_002/readme.md new file mode 100644 index 0000000..0933f0b --- /dev/null +++ b/Geschachtelte_Klassen/Lambdas_002/readme.md @@ -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. + + + \ No newline at end of file diff --git a/Geschachtelte_Klassen/Lambdas_002/solution/readme.md b/Geschachtelte_Klassen/Lambdas_002/solution/readme.md new file mode 100644 index 0000000..fe048c7 --- /dev/null +++ b/Geschachtelte_Klassen/Lambdas_002/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Innere Klasse Beobachter + +Musterlösung: + +[pr2.lambda.observer](../../solutions/src/main/java/pr2/lambda/observer/). diff --git a/Geschachtelte_Klassen/Lambdas_003/readme.md b/Geschachtelte_Klassen/Lambdas_003/readme.md new file mode 100644 index 0000000..09845c5 --- /dev/null +++ b/Geschachtelte_Klassen/Lambdas_003/readme.md @@ -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. + + + \ No newline at end of file diff --git a/Geschachtelte_Klassen/Lambdas_003/solution/readme.md b/Geschachtelte_Klassen/Lambdas_003/solution/readme.md new file mode 100644 index 0000000..f3f2c66 --- /dev/null +++ b/Geschachtelte_Klassen/Lambdas_003/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Callback mit anonymer Klasse realisieren + +Musterlösung: + +[pr2.lambda.callback](../../solutions/src/main/java/pr2/lambda/callback/) diff --git a/Geschachtelte_Klassen/Lambdas_004/readme.md b/Geschachtelte_Klassen/Lambdas_004/readme.md new file mode 100644 index 0000000..c335ba0 --- /dev/null +++ b/Geschachtelte_Klassen/Lambdas_004/readme.md @@ -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. + + + \ No newline at end of file diff --git a/Geschachtelte_Klassen/Lambdas_004/solution/readme.md b/Geschachtelte_Klassen/Lambdas_004/solution/readme.md new file mode 100644 index 0000000..43f250d --- /dev/null +++ b/Geschachtelte_Klassen/Lambdas_004/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Comparator als Lambda + +Musterlösung: + +[pr2.lambda.comparator](../../solutions/src/main/java/pr2/lambda/comparator/) diff --git a/Geschachtelte_Klassen/Lambdas_005/readme.md b/Geschachtelte_Klassen/Lambdas_005/readme.md new file mode 100644 index 0000000..0f5aceb --- /dev/null +++ b/Geschachtelte_Klassen/Lambdas_005/readme.md @@ -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. + + + \ No newline at end of file diff --git a/Geschachtelte_Klassen/Lambdas_005/solution/readme.md b/Geschachtelte_Klassen/Lambdas_005/solution/readme.md new file mode 100644 index 0000000..dec56e3 --- /dev/null +++ b/Geschachtelte_Klassen/Lambdas_005/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Callback mit Lambda realisieren + +Musterlösung: + +[pr2.lambda.lambdas](../../solutions/src/main/java/pr2/lambda/lambdas/) diff --git a/Geschachtelte_Klassen/Lambdas_006/readme.md b/Geschachtelte_Klassen/Lambdas_006/readme.md new file mode 100644 index 0000000..093e549 --- /dev/null +++ b/Geschachtelte_Klassen/Lambdas_006/readme.md @@ -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. + + + \ No newline at end of file diff --git a/Geschachtelte_Klassen/Lambdas_006/solution/readme.md b/Geschachtelte_Klassen/Lambdas_006/solution/readme.md new file mode 100644 index 0000000..e3b7c01 --- /dev/null +++ b/Geschachtelte_Klassen/Lambdas_006/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: MatrixSuche + +Musterlösung: + +[pr2.lambda.matrixsuche](../../solutions/src/main/java/pr2/lambda/matrixsuche/) diff --git a/Geschachtelte_Klassen/Lambdas_007/readme.md b/Geschachtelte_Klassen/Lambdas_007/readme.md new file mode 100644 index 0000000..0540132 --- /dev/null +++ b/Geschachtelte_Klassen/Lambdas_007/readme.md @@ -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. + + + \ No newline at end of file diff --git a/Geschachtelte_Klassen/Lambdas_007/solution/readme.md b/Geschachtelte_Klassen/Lambdas_007/solution/readme.md new file mode 100644 index 0000000..8bf44e0 --- /dev/null +++ b/Geschachtelte_Klassen/Lambdas_007/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: StringTransmogrifier + +Musterlösung: + +[pr2.lambda.mogrifier_1](../../solutions/src/main/java/pr2/lambda/mogrifier_1/) diff --git a/Geschachtelte_Klassen/Lambdas_008/readme.md b/Geschachtelte_Klassen/Lambdas_008/readme.md new file mode 100644 index 0000000..f1ce368 --- /dev/null +++ b/Geschachtelte_Klassen/Lambdas_008/readme.md @@ -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`. + + + \ No newline at end of file diff --git a/Geschachtelte_Klassen/Lambdas_008/solution/readme.md b/Geschachtelte_Klassen/Lambdas_008/solution/readme.md new file mode 100644 index 0000000..9746d8f --- /dev/null +++ b/Geschachtelte_Klassen/Lambdas_008/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: StringTransmogrifier erweitern + +Musterlösung: + +[pr2.lambda.mogrifier_2](../../solutions/src/main/java/pr2/lambda/mogrifier_2/) diff --git a/readme.md b/readme.md index 6452d2a..378efde 100644 --- a/readme.md +++ b/readme.md @@ -10,114 +10,114 @@ 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/) | -| 4. | Auffrischung | [printf mit Formatstring](Auffrischung_004/readme.md) | [✅](Auffrischung_004/solution/) | -| 5. | Auffrischung | [Maximum in einem Array suchen](Auffrischung_005/readme.md) | [✅](Auffrischung_005/solution/) | -| 6. | Auffrischung | [Taschenrechner](Auffrischung_006/readme.md) | [✅](Auffrischung_006/solution/) | -| 7. | Einführung | [Java-Coding-Standard anwenden](Einfuehrung_001/readme.md) | [✅](Einfuehrung_001/solution/) | -| 8. | Einführung | [Javadoc schreiben](Einfuehrung_002/readme.md) | [✅](Einfuehrung_002/solution/) | -| 9. | Einführung | [Klasse mit JUnit testen](Einfuehrung_003/readme.md) | [✅](Einfuehrung_003/solution/) | -| 10. | Strukturierung | [Information-Hiding einer Klasse verbessern](Strukturierung_001/readme.md) | [✅](Strukturierung_001/solution/) | -| 11. | Strukturierung | [Vorhandene Bibliotheken als JAR einbinden](Strukturierung_002/readme.md) | [✅](Strukturierung_002/solution/) | -| 12. | Vererbung | [Final anwenden](Vererbung_001/readme.md) | [✅](Vererbung_001/solution/) | -| 13. | Vererbung | [Figur und Rechteck](Vererbung_002/readme.md) | [✅](Vererbung_002/solution/) | -| 14. | Vererbung | [Figur erweitern](Vererbung_003/readme.md) | [✅](Vererbung_003/solution/) | -| 15. | Vererbung | [Figur noch einmal erweitern](Vererbung_004/readme.md) | [✅](Vererbung_004/solution/) | -| 16. | Vererbung | [Konstruktoren schreiben](Vererbung_005/readme.md) | [✅](Vererbung_005/solution/) | -| 17. | Vererbung | [Polymorphie einsetzen](Vererbung_006/readme.md) | [✅](Vererbung_006/solution/) | -| 18. | Vererbung | [Singleton](Vererbung_007/readme.md) | [✅](Vererbung_007/solution/) | -| 19. | Vererbung | [Statische Methoden und Attribute](Vererbung_008/readme.md) | [✅](Vererbung_008/solution/) | -| 20. | Vererbung | [Methode überladen](Vererbung_009/readme.md) | [✅](Vererbung_009/solution/) | -| 21. | Vererbung | [Methoden überschreiben](Vererbung_010/readme.md) | [✅](Vererbung_010/solution/) | -| 22. | Vererbung | [Varag-Methode schreiben](Vererbung_011/readme.md) | [✅](Vererbung_011/solution/) | -| 23. | Vererbung | [Vererbung von Figuren](Vererbung_012/readme.md) | [✅](Vererbung_012/solution/) | -| 24. | Abstrakte Klassen | [Abstrakte Klassen](Abstrakte_Klassen_001/readme.md) | [✅](Abstrakte_Klassen_001/solution/) | -| 25. | Abstrakte Klassen | [Abstrakte Klasse](Abstrakte_Klassen_002/readme.md) | [✅](Abstrakte_Klassen_002/solution/) | -| 26. | Interfaces | [Comparable implementieren](Interfaces_001/readme.md) | [✅](Interfaces_001/solution/) | -| 27. | Interfaces | [Interface Stack entwerfen](Interfaces_002/readme.md) | [✅](Interfaces_002/solution/) | -| 28. | Interfaces | [Interface: Uebersetzer](Interfaces_003/readme.md) | [✅](Interfaces_003/solution/) | -| 29. | Interfaces | [Interfaces anwenden und entwerfen](Interfaces_004/readme.md) | [✅](Interfaces_004/solution/) | -| 30. | Object und Wrapper | [Deep-Copy mit `clone()`](Object_und_Wrapper_001/readme.md) | [✅](Object_und_Wrapper_001/solution/) | -| 31. | Object und Wrapper | [Clone](Object_und_Wrapper_002/readme.md) | [✅](Object_und_Wrapper_002/solution/) | -| 32. | Object und Wrapper | [`equals()` und `hashCode()` implementieren und nutzen](Object_und_Wrapper_003/readme.md) | [✅](Object_und_Wrapper_003/solution/) | -| 33. | Object und Wrapper | [equals und hashCode](Object_und_Wrapper_004/readme.md) | [✅](Object_und_Wrapper_004/solution/) | -| 34. | Object und Wrapper | [`toString()`-Methode implementieren](Object_und_Wrapper_005/readme.md) | [✅](Object_und_Wrapper_005/solution/) | -| 35. | Object und Wrapper | [Optimierung bei Integer](Object_und_Wrapper_006/readme.md) | [✅](Object_und_Wrapper_006/solution/) | -| 36. | Object und Wrapper | [Methoden der Wrapper-Klassen](Object_und_Wrapper_007/readme.md) | [✅](Object_und_Wrapper_007/solution/) | -| 37. | Enumerationen | [Eigene Enumeration schreiben und verwenden](Enumerationen_001/readme.md) | [✅](Enumerationen_001/solution/) | -| 38. | Enumerationen | [Enumeration schreiben](Enumerationen_002/readme.md) | [✅](Enumerationen_002/solution/) | -| 39. | Enumerationen | [Singleton-Eigenschaft von Enumerationen](Enumerationen_003/readme.md) | [✅](Enumerationen_003/solution/) | -| 40. | Enumerationen | [Stein, Papier, Schere, Echse, Spock](Enumerationen_004/readme.md) | [✅](Enumerationen_004/solution/) | -| 41. | Ausnahmen | [Ausnahmen testen](Ausnahmen_001/readme.md) | [✅](Ausnahmen_001/solution/) | -| 42. | Ausnahmen | [Eigene Ausnahmen schreiben und an entsprechender Stelle werfen](Ausnahmen_002/readme.md) | [✅](Ausnahmen_002/solution/) | -| 43. | Ausnahmen | [Eigene Exception schreiben](Ausnahmen_003/readme.md) | [✅](Ausnahmen_003/solution/) | -| 44. | Ausnahmen | [Handle-or-Declare-Regel anwenden](Ausnahmen_004/readme.md) | [✅](Ausnahmen_004/solution/) | -| 45. | Ausnahmen | [Ausnahmen mit `try` und `catch` behandeln.](Ausnahmen_005/readme.md) | [✅](Ausnahmen_005/solution/) | -| 46. | Input und Output | [`BufferedReader` zum zeilenweisen Lesen einsetzen](Input_und_Output_001/readme.md) | [✅](Input_und_Output_001/solution/) | -| 47. | Input und Output | [DataOutputStream](Input_und_Output_002/readme.md) | [✅](Input_und_Output_002/solution/) | -| 48. | Input und Output | [DataOutputStream durch Serialisierung ersetzen](Input_und_Output_003/readme.md) | [✅](Input_und_Output_003/solution/) | -| 49. | Input und Output | [Daten mit `DataOutputStream` und `DataInputStream` verarbeiten](Input_und_Output_004/readme.md) | [✅](Input_und_Output_004/solution/) | -| 50. | Input und Output | [Daten mit einem `InputStream` lesen](Input_und_Output_005/readme.md) | [✅](Input_und_Output_005/solution/) | -| 51. | Input und Output | [Daten mit einem `OutputStream` schreiben](Input_und_Output_006/readme.md) | [✅](Input_und_Output_006/solution/) | -| 52. | Input und Output | [Filesystem-Abstraktion mit `File`](Input_und_Output_007/readme.md) | [✅](Input_und_Output_007/solution/) | -| 53. | Input und Output | [Fileattribute lesen](Input_und_Output_008/readme.md) | [✅](Input_und_Output_008/solution/) | -| 54. | Input und Output | [`FilterReader`](Input_und_Output_009/readme.md) | [✅](Input_und_Output_009/solution/) | -| 55. | Input und Output | [Konsolen Input/Output](Input_und_Output_010/readme.md) | [✅](Input_und_Output_010/solution/) | -| 56. | Input und Output | [Zeilen einer Textdatei zählen](Input_und_Output_011/readme.md) | [✅](Input_und_Output_011/solution/) | -| 57. | Input und Output | [`RandomAccessFile`](Input_und_Output_012/readme.md) | [✅](Input_und_Output_012/solution/) | -| 58. | Input und Output | [`Reader` verwenden](Input_und_Output_013/readme.md) | [✅](Input_und_Output_013/solution/) | -| 59. | Input und Output | [Rot13-Verschlüsselung](Input_und_Output_014/readme.md) | [✅](Input_und_Output_014/solution/) | -| 60. | Input und Output | [Datei zerhacken](Input_und_Output_015/readme.md) | [✅](Input_und_Output_015/solution/) | -| 61. | Input und Output | [Serialisierung](Input_und_Output_016/readme.md) | [✅](Input_und_Output_016/solution/) | -| 62. | Generische Typen | [Einen generischen Typ schreiben](Generische_Typen_001/readme.md) | [✅](Generische_Typen_001/solution/) | -| 63. | Generische Typen | [Generische Klasse Pair schreiben](Generische_Typen_002/readme.md) | [✅](Generische_Typen_002/solution/) | -| 64. | Generische Typen | [Generische Klasse Pair erweitern: NumberPair](Generische_Typen_003/readme.md) | [✅](Generische_Typen_003/solution/) | -| 65. | Generische Typen | [Generische Klasse Pair erweitern: SamePair](Generische_Typen_004/readme.md) | [✅](Generische_Typen_004/solution/) | -| 66. | Generische Typen | [PairList](Generische_Typen_005/readme.md) | [✅](Generische_Typen_005/solution/) | -| 67. | Generische Typen | [Wildcard benutzen](Generische_Typen_006/readme.md) | [✅](Generische_Typen_006/solution/) | -| 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/) | -| 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` und dessen Implementierungen](Collections_003/readme.md) | [✅](Collections_003/solution/) | -| 82. | Collections | [`Map` verwenden](Collections_004/readme.md) | [✅](Collections_004/solution/) | -| 83. | Collections | [ReverserGeneric](Collections_005/readme.md) | [✅](Collections_005/solution/) | -| 84. | Collections | [Strings umgekehrt sortieren: Reverser](Collections_006/readme.md) | [✅](Collections_006/solution/) | -| 85. | Collections | [`Set` und dessen Implementierungen](Collections_007/readme.md) | [✅](Collections_007/solution/) | -| 86. | Collections | [CommandLineSorter](Collections_008/readme.md) | [✅](Collections_008/solution/) | -| 87. | Collections | [CommandLineSorter -- Version 2](Collections_009/readme.md) | [✅](Collections_009/solution/) | -| 88. | Collections | [`Comparator` verwenden und Objekte sortieren](Collections_010/readme.md) | [✅](Collections_010/solution/) | -| 89. | Collections | [Wörterbuchprogramm](Collections_011/readme.md) | [✅](Collections_011/solution/) | -| 90. | Streams | [Kleinbuchstaben in einem String zählen](Streams_001/readme.md) | [✅](Streams_001/solution/) | -| 91. | Streams | [Buchstaben in einer Liste von Strings zählen](Streams_002/readme.md) | [✅](Streams_002/solution/) | -| 92. | Streams | [Kleinbuchstaben in einem String zählen](Streams_003/readme.md) | [✅](Streams_003/solution/) | -| 93. | Streams | [Liste filtern](Streams_004/readme.md) | [✅](Streams_004/solution/) | -| 94. | Streams | [Streams mit interner Iteration](Streams_005/readme.md) | [✅](Streams_005/solution/) | -| 95. | Streams | [Map und Filter auf Streams](Streams_006/readme.md) | [✅](Streams_006/solution/) | -| 96. | Streams | [Map und Reduce auf Streams](Streams_007/readme.md) | [✅](Streams_007/solution/) | -| 97. | Streams | [Reduce](Streams_008/readme.md) | [✅](Streams_008/solution/) | -| 98. | Streams | [Summe über reduce bestimmen](Streams_009/readme.md) | [✅](Streams_009/solution/) | -| 99. | Streams | [Wörter zählen](Streams_010/readme.md) | [✅](Streams_010/solution/) | -| 100. | Threads | [Fakultät parallel berechnen](Threads_001/readme.md) | [✅](Threads_001/solution/) | -| 101. | Threads | [Thread per interrupt beenden](Threads_002/readme.md) | [✅](Threads_002/solution/) | -| 102. | Threads | [wait und notify benutzen](Threads_003/readme.md) | [✅](Threads_003/solution/) | -| 103. | Threads | [Parallele Ausgaben erzeugen](Threads_004/readme.md) | [✅](Threads_004/solution/) | -| 104. | Threads | [Race-Condition finden und beheben](Threads_005/readme.md) | [✅](Threads_005/solution/) | -| 105. | Threads | [Stack und Heap unterscheiden](Threads_006/readme.md) | [✅](Threads_006/solution/) | -| 106. | Threads | [synchronized verwenden](Threads_007/readme.md) | [✅](Threads_007/solution/) | -| 107. | Threads | [Timer und TimerTask verwenden](Threads_008/readme.md) | [✅](Threads_008/solution/) | -| 108. | Reflection | [Klasse per Reflection analysieren](Reflection_001/readme.md) | [✅](Reflection_001/solution/) | -| 109. | Reflection | [Objekte per Reflection erzeugen](Reflection_002/readme.md) | [✅](Reflection_002/solution/) | +| # | 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/) | +| 4. | Auffrischung | [printf mit Formatstring](Auffrischung_004/readme.md) | [✅](Auffrischung_004/solution/) | +| 5. | Auffrischung | [Maximum in einem Array suchen](Auffrischung_005/readme.md) | [✅](Auffrischung_005/solution/) | +| 6. | Auffrischung | [Taschenrechner](Auffrischung_006/readme.md) | [✅](Auffrischung_006/solution/) | +| 7. | Einführung | [Java-Coding-Standard anwenden](Einfuehrung_001/readme.md) | [✅](Einfuehrung_001/solution/) | +| 8. | Einführung | [Javadoc schreiben](Einfuehrung_002/readme.md) | [✅](Einfuehrung_002/solution/) | +| 9. | Einführung | [Klasse mit JUnit testen](Einfuehrung_003/readme.md) | [✅](Einfuehrung_003/solution/) | +| 10. | Strukturierung | [Information-Hiding einer Klasse verbessern](Strukturierung_001/readme.md) | [✅](Strukturierung_001/solution/) | +| 11. | Strukturierung | [Vorhandene Bibliotheken als JAR einbinden](Strukturierung_002/readme.md) | [✅](Strukturierung_002/solution/) | +| 12. | Vererbung | [Final anwenden](Vererbung_001/readme.md) | [✅](Vererbung_001/solution/) | +| 13. | Vererbung | [Figur und Rechteck](Vererbung_002/readme.md) | [✅](Vererbung_002/solution/) | +| 14. | Vererbung | [Figur erweitern](Vererbung_003/readme.md) | [✅](Vererbung_003/solution/) | +| 15. | Vererbung | [Figur noch einmal erweitern](Vererbung_004/readme.md) | [✅](Vererbung_004/solution/) | +| 16. | Vererbung | [Konstruktoren schreiben](Vererbung_005/readme.md) | [✅](Vererbung_005/solution/) | +| 17. | Vererbung | [Polymorphie einsetzen](Vererbung_006/readme.md) | [✅](Vererbung_006/solution/) | +| 18. | Vererbung | [Singleton](Vererbung_007/readme.md) | [✅](Vererbung_007/solution/) | +| 19. | Vererbung | [Statische Methoden und Attribute](Vererbung_008/readme.md) | [✅](Vererbung_008/solution/) | +| 20. | Vererbung | [Methode überladen](Vererbung_009/readme.md) | [✅](Vererbung_009/solution/) | +| 21. | Vererbung | [Methoden überschreiben](Vererbung_010/readme.md) | [✅](Vererbung_010/solution/) | +| 22. | Vererbung | [Varag-Methode schreiben](Vererbung_011/readme.md) | [✅](Vererbung_011/solution/) | +| 23. | Vererbung | [Vererbung von Figuren](Vererbung_012/readme.md) | [✅](Vererbung_012/solution/) | +| 24. | Abstrakte Klassen | [Abstrakte Klassen](Abstrakte_Klassen_001/readme.md) | [✅](Abstrakte_Klassen_001/solution/) | +| 25. | Abstrakte Klassen | [Abstrakte Klasse](Abstrakte_Klassen_002/readme.md) | [✅](Abstrakte_Klassen_002/solution/) | +| 26. | Interfaces | [Comparable implementieren](Interfaces_001/readme.md) | [✅](Interfaces_001/solution/) | +| 27. | Interfaces | [Interface Stack entwerfen](Interfaces_002/readme.md) | [✅](Interfaces_002/solution/) | +| 28. | Interfaces | [Interface: Uebersetzer](Interfaces_003/readme.md) | [✅](Interfaces_003/solution/) | +| 29. | Interfaces | [Interfaces anwenden und entwerfen](Interfaces_004/readme.md) | [✅](Interfaces_004/solution/) | +| 30. | Object und Wrapper | [Deep-Copy mit `clone()`](Object_und_Wrapper_001/readme.md) | [✅](Object_und_Wrapper_001/solution/) | +| 31. | Object und Wrapper | [Clone](Object_und_Wrapper_002/readme.md) | [✅](Object_und_Wrapper_002/solution/) | +| 32. | Object und Wrapper | [`equals()` und `hashCode()` implementieren und nutzen](Object_und_Wrapper_003/readme.md) | [✅](Object_und_Wrapper_003/solution/) | +| 33. | Object und Wrapper | [equals und hashCode](Object_und_Wrapper_004/readme.md) | [✅](Object_und_Wrapper_004/solution/) | +| 34. | Object und Wrapper | [`toString()`-Methode implementieren](Object_und_Wrapper_005/readme.md) | [✅](Object_und_Wrapper_005/solution/) | +| 35. | Object und Wrapper | [Optimierung bei Integer](Object_und_Wrapper_006/readme.md) | [✅](Object_und_Wrapper_006/solution/) | +| 36. | Object und Wrapper | [Methoden der Wrapper-Klassen](Object_und_Wrapper_007/readme.md) | [✅](Object_und_Wrapper_007/solution/) | +| 37. | Enumerationen | [Eigene Enumeration schreiben und verwenden](Enumerationen_001/readme.md) | [✅](Enumerationen_001/solution/) | +| 38. | Enumerationen | [Enumeration schreiben](Enumerationen_002/readme.md) | [✅](Enumerationen_002/solution/) | +| 39. | Enumerationen | [Singleton-Eigenschaft von Enumerationen](Enumerationen_003/readme.md) | [✅](Enumerationen_003/solution/) | +| 40. | Enumerationen | [Stein, Papier, Schere, Echse, Spock](Enumerationen_004/readme.md) | [✅](Enumerationen_004/solution/) | +| 41. | Ausnahmen | [Ausnahmen testen](Ausnahmen_001/readme.md) | [✅](Ausnahmen_001/solution/) | +| 42. | Ausnahmen | [Eigene Ausnahmen schreiben und an entsprechender Stelle werfen](Ausnahmen_002/readme.md) | [✅](Ausnahmen_002/solution/) | +| 43. | Ausnahmen | [Eigene Exception schreiben](Ausnahmen_003/readme.md) | [✅](Ausnahmen_003/solution/) | +| 44. | Ausnahmen | [Handle-or-Declare-Regel anwenden](Ausnahmen_004/readme.md) | [✅](Ausnahmen_004/solution/) | +| 45. | Ausnahmen | [Ausnahmen mit `try` und `catch` behandeln.](Ausnahmen_005/readme.md) | [✅](Ausnahmen_005/solution/) | +| 46. | Input und Output | [`BufferedReader` zum zeilenweisen Lesen einsetzen](Input_und_Output_001/readme.md) | [✅](Input_und_Output_001/solution/) | +| 47. | Input und Output | [DataOutputStream](Input_und_Output_002/readme.md) | [✅](Input_und_Output_002/solution/) | +| 48. | Input und Output | [DataOutputStream durch Serialisierung ersetzen](Input_und_Output_003/readme.md) | [✅](Input_und_Output_003/solution/) | +| 49. | Input und Output | [Daten mit `DataOutputStream` und `DataInputStream` verarbeiten](Input_und_Output_004/readme.md) | [✅](Input_und_Output_004/solution/) | +| 50. | Input und Output | [Daten mit einem `InputStream` lesen](Input_und_Output_005/readme.md) | [✅](Input_und_Output_005/solution/) | +| 51. | Input und Output | [Daten mit einem `OutputStream` schreiben](Input_und_Output_006/readme.md) | [✅](Input_und_Output_006/solution/) | +| 52. | Input und Output | [Filesystem-Abstraktion mit `File`](Input_und_Output_007/readme.md) | [✅](Input_und_Output_007/solution/) | +| 53. | Input und Output | [Fileattribute lesen](Input_und_Output_008/readme.md) | [✅](Input_und_Output_008/solution/) | +| 54. | Input und Output | [`FilterReader`](Input_und_Output_009/readme.md) | [✅](Input_und_Output_009/solution/) | +| 55. | Input und Output | [Konsolen Input/Output](Input_und_Output_010/readme.md) | [✅](Input_und_Output_010/solution/) | +| 56. | Input und Output | [Zeilen einer Textdatei zählen](Input_und_Output_011/readme.md) | [✅](Input_und_Output_011/solution/) | +| 57. | Input und Output | [`RandomAccessFile`](Input_und_Output_012/readme.md) | [✅](Input_und_Output_012/solution/) | +| 58. | Input und Output | [`Reader` verwenden](Input_und_Output_013/readme.md) | [✅](Input_und_Output_013/solution/) | +| 59. | Input und Output | [Rot13-Verschlüsselung](Input_und_Output_014/readme.md) | [✅](Input_und_Output_014/solution/) | +| 60. | Input und Output | [Datei zerhacken](Input_und_Output_015/readme.md) | [✅](Input_und_Output_015/solution/) | +| 61. | Input und Output | [Serialisierung](Input_und_Output_016/readme.md) | [✅](Input_und_Output_016/solution/) | +| 62. | Generische Typen | [Einen generischen Typ schreiben](Generische_Typen_001/readme.md) | [✅](Generische_Typen_001/solution/) | +| 63. | Generische Typen | [Generische Klasse Pair schreiben](Generische_Typen_002/readme.md) | [✅](Generische_Typen_002/solution/) | +| 64. | Generische Typen | [Generische Klasse Pair erweitern: NumberPair](Generische_Typen_003/readme.md) | [✅](Generische_Typen_003/solution/) | +| 65. | Generische Typen | [Generische Klasse Pair erweitern: SamePair](Generische_Typen_004/readme.md) | [✅](Generische_Typen_004/solution/) | +| 66. | Generische Typen | [PairList](Generische_Typen_005/readme.md) | [✅](Generische_Typen_005/solution/) | +| 67. | Generische Typen | [Wildcard benutzen](Generische_Typen_006/readme.md) | [✅](Generische_Typen_006/solution/) | +| 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/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` und dessen Implementierungen](Collections_003/readme.md) | [✅](Collections_003/solution/) | +| 82. | Collections | [`Map` verwenden](Collections_004/readme.md) | [✅](Collections_004/solution/) | +| 83. | Collections | [ReverserGeneric](Collections_005/readme.md) | [✅](Collections_005/solution/) | +| 84. | Collections | [Strings umgekehrt sortieren: Reverser](Collections_006/readme.md) | [✅](Collections_006/solution/) | +| 85. | Collections | [`Set` und dessen Implementierungen](Collections_007/readme.md) | [✅](Collections_007/solution/) | +| 86. | Collections | [CommandLineSorter](Collections_008/readme.md) | [✅](Collections_008/solution/) | +| 87. | Collections | [CommandLineSorter -- Version 2](Collections_009/readme.md) | [✅](Collections_009/solution/) | +| 88. | Collections | [`Comparator` verwenden und Objekte sortieren](Collections_010/readme.md) | [✅](Collections_010/solution/) | +| 89. | Collections | [Wörterbuchprogramm](Collections_011/readme.md) | [✅](Collections_011/solution/) | +| 90. | Streams | [Kleinbuchstaben in einem String zählen](Streams_001/readme.md) | [✅](Streams_001/solution/) | +| 91. | Streams | [Buchstaben in einer Liste von Strings zählen](Streams_002/readme.md) | [✅](Streams_002/solution/) | +| 92. | Streams | [Kleinbuchstaben in einem String zählen](Streams_003/readme.md) | [✅](Streams_003/solution/) | +| 93. | Streams | [Liste filtern](Streams_004/readme.md) | [✅](Streams_004/solution/) | +| 94. | Streams | [Streams mit interner Iteration](Streams_005/readme.md) | [✅](Streams_005/solution/) | +| 95. | Streams | [Map und Filter auf Streams](Streams_006/readme.md) | [✅](Streams_006/solution/) | +| 96. | Streams | [Map und Reduce auf Streams](Streams_007/readme.md) | [✅](Streams_007/solution/) | +| 97. | Streams | [Reduce](Streams_008/readme.md) | [✅](Streams_008/solution/) | +| 98. | Streams | [Summe über reduce bestimmen](Streams_009/readme.md) | [✅](Streams_009/solution/) | +| 99. | Streams | [Wörter zählen](Streams_010/readme.md) | [✅](Streams_010/solution/) | +| 100. | Threads | [Fakultät parallel berechnen](Threads_001/readme.md) | [✅](Threads_001/solution/) | +| 101. | Threads | [Thread per interrupt beenden](Threads_002/readme.md) | [✅](Threads_002/solution/) | +| 102. | Threads | [wait und notify benutzen](Threads_003/readme.md) | [✅](Threads_003/solution/) | +| 103. | Threads | [Parallele Ausgaben erzeugen](Threads_004/readme.md) | [✅](Threads_004/solution/) | +| 104. | Threads | [Race-Condition finden und beheben](Threads_005/readme.md) | [✅](Threads_005/solution/) | +| 105. | Threads | [Stack und Heap unterscheiden](Threads_006/readme.md) | [✅](Threads_006/solution/) | +| 106. | Threads | [synchronized verwenden](Threads_007/readme.md) | [✅](Threads_007/solution/) | +| 107. | Threads | [Timer und TimerTask verwenden](Threads_008/readme.md) | [✅](Threads_008/solution/) | +| 108. | Reflection | [Klasse per Reflection analysieren](Reflection_001/readme.md) | [✅](Reflection_001/solution/) | +| 109. | Reflection | [Objekte per Reflection erzeugen](Reflection_002/readme.md) | [✅](Reflection_002/solution/) |