# Programmieren 2 (Wintersemester 2024/2025)

## 👋 Willkommen zum Kurs Programmieren 2

In Programmieren 2 lernen Sie die Programmierung in Java auf einem fortgeschrittenen Niveau. Sie werden alle wichtigen Konzepte von Java kennenlernen und diese in praktischen Übungen anwenden. Hierbei werden Sie in kleinen Teams arbeiten und komplexere, objektorientierte Programme in Java entwickeln. Die dazu nötigen objektorientierten Konzepte (Polymorphie, Vererbung, Interfaces, etc.) werden Sie ebenso im Kurs anwenden, wie die dazu grundlegenden Algorithmen und Datenstrukturen.

## 🎓 Freiwillige Übungen

Hier finden Sie die **freiwilligen Übungen** zur Vorlesung Programmieren 2 (PR2). Die Übungen sind unten aufgelistet. Die Spalte **Ausgabe** hat keine Bedeutung.

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)                                                   |   |
| 80. | Collections           | [Iterator programmieren](Collections_002/readme.md)                                               |   |
| 81. | Collections           | [`List<T>` und dessen Implementierungen](Collections_003/readme.md)                               |   |
| 82. | Collections           | [`Map<T>` verwenden](Collections_004/readme.md)                                                   |   |
| 83. | Collections           | [ReverserGeneric](Collections_005/readme.md)                                                      |   |
| 84. | Collections           | [Strings umgekehrt sortieren: Reverser](Collections_006/readme.md)                                |   |
| 85. | Collections           | [`Set<T>` und dessen Implementierungen](Collections_007/readme.md)                                |   |
| 86. | Collections           | [CommandLineSorter](Collections_008/readme.md)                                                    |   |
| 87. | Collections           | [CommandLineSorter -- Version 2](Collections_009/readme.md)                                       |   |
| 88. | Collections           | [`Comparator<T>` verwenden und Objekte sortieren](Collections_010/readme.md)                      |   |
| 89. | Collections           | [Wörterbuchprogramm](Collections_011/readme.md)                                                   |   |
| 90. | Streams               | [Kleinbuchstaben in einem String zählen](Streams_001/readme.md)                                   |   |
| 91. | Streams               | [Buchstaben in einer Liste von Strings zählen](Streams_002/readme.md)                             |   |
| 92. | Streams               | [Kleinbuchstaben in einem String zählen](Streams_003/readme.md)                                   |   |
| 93. | Streams               | [Liste filtern](Streams_004/readme.md)                                                            |   |
| 94. | Streams               | [Streams mit interner Iteration](Streams_005/readme.md)                                           |   |
| 95. | Streams               | [Map und Filter auf Streams](Streams_006/readme.md)                                               |   |
| 96. | Streams               | [Map und Reduce auf Streams](Streams_007/readme.md)                                               |   |
| 97. | Streams               | [Reduce](Streams_008/readme.md)                                                                   |   |
| 98. | Streams               | [Summe über reduce bestimmen](Streams_009/readme.md)                                              |   |
| 99. | Streams               | [Wörter zählen](Streams_010/readme.md)                                                            |   |
| 100. | Threads               | [Fakultät parallel berechnen](Threads_001/readme.md)                                              |   |
| 101. | Threads               | [Thread per interrupt beenden](Threads_002/readme.md)                                             |   |
| 102. | Threads               | [wait und notify benutzen](Threads_003/readme.md)                                                 |   |
| 103. | Threads               | [Parallele Ausgaben erzeugen](Threads_004/readme.md)                                              |   |
| 104. | Threads               | [Race-Condition finden und beheben](Threads_005/readme.md)                                        |   |
| 105. | Threads               | [Stack und Heap unterscheiden](Threads_006/readme.md)                                             |   |
| 106. | Threads               | [synchronized verwenden](Threads_007/readme.md)                                                   |   |
| 107. | Threads               | [Timer und TimerTask verwenden](Threads_008/readme.md)                                            |   |
| 108. | Reflection            | [Klasse per Reflection analysieren](Reflection_001/readme.md)                                     |   |
| 109. | Reflection            | [Objekte per Reflection erzeugen](Reflection_002/readme.md)                                       |   |
