Update of exercises

main
Thomas Smits 2026-01-13 14:14:02 +01:00
parent d8ac950bc1
commit 0c8383fd67
325 changed files with 8868 additions and 194 deletions

View File

@ -1,6 +1,6 @@
# Abstrakte Klassen
## Lernziel
[Musterlösung](solution/)
Eine abstrakte Klasse einsetzen, um eine einheitliche Schnittstelle für unterschiedliche Klassen anzubieten.

View File

@ -1,6 +1,6 @@
# Abstrakte Klasse
## Lernziel
[Musterlösung](solution/)
Abstrakte Klasse verwenden.

View File

@ -1,6 +1,6 @@
# Ausnahmen testen
## Lernziel
[Musterlösung](solution/)
Bei einer gegebenen Klasse Testfälle mit JUnit schreiben, die auf das Werfen von Ausnahmen testen.

View File

@ -1,6 +1,6 @@
# Eigene Ausnahmen schreiben und an entsprechender Stelle werfen
## Lernziel
[Musterlösung](solution/)
Ausnahmen programmieren und sinnvoll einsetzen. Bedeutung der Schlüsselwörter `throws` und `throw` verstehen.

View File

@ -1,6 +1,6 @@
# Eigene Exception schreiben
## Lernziel
[Musterlösung](solution/)
Eigene Exceptions entwerfen und verwenden.

View File

@ -1,6 +1,6 @@
# Handle-or-Declare-Regel anwenden
## Lernziel
[Musterlösung](solution/)
In einem vorhandenen Programm die Ausnahmen korrekt weiter deklarieren und an den richtigen Stellen fangen.

View File

@ -1,6 +1,6 @@
# Ausnahmen mit `try` und `catch` behandeln.
## Lernziel
[Musterlösung](solution/)
Vorhandene Ausnahmen mit `try` und `catch` abfangen und behandeln.

View File

@ -1,6 +1,6 @@
# Iterator schreiben
## Lernziel
[Musterlösung](solution/)
Für eine gegebene Klasse einen Iterator schreiben.

View File

@ -1,6 +1,6 @@
# Iterator programmieren
## Lernziel
[Musterlösung](solution/)
Iteratoren verstehen und programmieren.

View File

@ -1,6 +1,6 @@
# `List<T>` und dessen Implementierungen
## Lernziel
[Musterlösung](solution/)
Das Interface `List<T>` und eine passende Implementierung einsetzen.

View File

@ -1,6 +1,6 @@
# `Map<T>` verwenden
## Lernziel
[Musterlösung](solution/)
Das Interface `Map<T>` und seine Implementierungen verwenden, um Daten effizient zu verarbeiten.

View File

@ -1,6 +1,6 @@
# ReverserGeneric
## Lernziel
[Musterlösung](solution/)
`Comparable` verstehen und nutzen.

View File

@ -1,6 +1,6 @@
# Strings umgekehrt sortieren: Reverser
## Lernziel
[Musterlösung](solution/)
`Comparable` verstehen und nutzen.

View File

@ -1,6 +1,6 @@
# `Set<T>` und dessen Implementierungen
## Lernziel
[Musterlösung](solution/)
Das Interface `Set<T>` und eine passende Implementierung einsetzen.

View File

@ -1,6 +1,6 @@
# CommandLineSorter
## Lernziel
[Musterlösung](solution/)
Sortieren von Collections.

View File

@ -1,6 +1,6 @@
# CommandLineSorter -- Version 2
## Lernziel
[Musterlösung](solution/)
Sortieren von Collections.

View File

@ -1,6 +1,6 @@
# `Comparator<T>` verwenden und Objekte sortieren
## Lernziel
[Musterlösung](solution/)
Verschiedene Sortierreihenfolgen durch die Implementierung von `Comparator<T>` realisieren.

View File

@ -1,6 +1,6 @@
# Wörterbuchprogramm
## Lernziel
[Musterlösung](solution/)
Interface `Map` und seine Implementierungen einsetzen.

View File

@ -1,6 +1,6 @@
# Eigene Enumeration schreiben und verwenden
## Lernziel
[Musterlösung](solution/)
Eine einfache Enumeration (ohne abstrakte Methoden) erstellen und in einem kleinen Programm einsetzen.

View File

@ -1,6 +1,6 @@
# Enumeration schreiben
## Lernziel
[Musterlösung](solution/)
Eine einfache Enumeration (ohne abstrakte Methoden) erstellen und in einem kleinen Programm einsetzen.

View File

@ -1,6 +1,6 @@
# Singleton-Eigenschaft von Enumerationen
## Lernziel
[Musterlösung](solution/)
Die Singleton-Eigenschaft von Enumerationen verstehen.

View File

@ -1,6 +1,6 @@
# Assignment: Stein, Papier, Schere, Echse, Spock
## Lernziel
[Musterlösung](solution/)
Mit Enumerationen arbeiten.

View File

@ -1,6 +1,6 @@
# Einen generischen Typ schreiben
## Lernziel
[Musterlösung](solution/)
Einen vorhandenen Typ so umgestalten, dass er als generischer Typ verwendet werden kann.

View File

@ -1,6 +1,6 @@
# Generische Klasse Pair schreiben
## Lernziel
[Musterlösung](solution/)
Von einem generischen Typ erben.

View File

@ -1,6 +1,6 @@
# Generische Klasse Pair erweitern: NumberPair
## Lernziel
[Musterlösung](solution/)
Von einem generischen Typ erben.

View File

@ -1,6 +1,6 @@
# Generische Klasse Pair erweitern: SamePair
## Lernziel
[Musterlösung](solution/)
Von einem generischen Typ erben.

View File

@ -1,6 +1,6 @@
# PairList
## Lernziel
[Musterlösung](solution/)
Sammlungen von Objekten eines generischen Typs erstellen.

View File

@ -1,6 +1,6 @@
# Wildcard benutzen
## Lernziel
[Musterlösung](solution/)
Wildcards einsetzen.

View File

@ -1,6 +1,6 @@
# Generische Queue
## Lernziel
[Musterlösung](solution/)
Einen komplexeren generischen Typ entwickeln.

View File

@ -1,6 +1,6 @@
# `super` und `extends` einsetzen
## Lernziel
[Musterlösung](solution/)
Methoden unter Verwendung von `super` und `extends` gestalten, sodass sie flexibel auch mit Sub- bzw. Supertypen umgehen können.

View File

@ -1,6 +1,6 @@
# Generische Typen zusammen mit Wildcards einsetzen
## Lernziel
[Musterlösung](solution/)
Gebundene und ungebundene Wildcards einsetzen.

View File

@ -1,6 +1,6 @@
# MatrixSuche
## Lernziel
[Musterlösung](solution/)
Statische innere Klassen einsetzen.

View File

@ -1,6 +1,6 @@
# Innere Klasse Beobachter
## Lernziel
[Musterlösung](solution/)
Zugriff von inneren Klassen auf die umgebende Klasse.

View File

@ -1,6 +1,6 @@
# Callback mit anonymer Klasse realisieren
## Lernziel
[Musterlösung](solution/)
Eine gegebene Funktion durch einen Callback parametrieren. Der Callback wird als anonyme innere Klasse realisiert.

View File

@ -1,6 +1,6 @@
# `BufferedReader` zum zeilenweisen Lesen einsetzen
## Lernziel
[Musterlösung](solution/)
Daten Zeilenweise mit einem `BufferedReader` verwenden und dabei das Decorator Pattern einsetzen.

View File

@ -1,6 +1,6 @@
# DataOutputStream
## Lernziel
[Musterlösung](solution/)
Daten mit einem `DataOutputStreams` manuell serialisieren.

View File

@ -1,6 +1,6 @@
# DataOutputStream durch Serialisierung ersetzen
## Lernziel
[Musterlösung](solution/)
Daten mit einem `ObjectOutputStreams` serialisieren.

View File

@ -1,6 +1,6 @@
# Daten mit `DataOutputStream` und `DataInputStream` verarbeiten
## Lernziel
[Musterlösung](solution/)
Ein eigenes Format für die Daten einer Klasse definieren und diese Dann in einer Datei speichern und aus dieser wieder laden.

View File

@ -1,6 +1,6 @@
# Daten mit einem `InputStream` lesen
## Lernziel
[Musterlösung](solution/)
Einen `InputStream` benutzen, um Daten aus einer Datei zu lesen.

View File

@ -1,6 +1,6 @@
# Daten mit einem `OutputStream` schreiben
## Lernziel
[Musterlösung](solution/)
Einen `OutputStream` verwenden, um Daten zu schreiben.

View File

@ -1,6 +1,6 @@
# Filesystem-Abstraktion mit `File`
## Lernziel
[Musterlösung](solution/)
Die Klasse `Path` einsetzen, um plattformunabhängig Operationen auf dem Dateisystem durchzuführen.

View File

@ -1,6 +1,6 @@
# Fileattribute lesen
## Lernziel
[Musterlösung](solution/)
Methoden der Klassen `Path` und `Files` nutzen und verstehen.

View File

@ -1,6 +1,6 @@
# `FilterReader`
## Lernziel
[Musterlösung](solution/)
Einen eigenen Filter in Form eines `FilterReaders` programmieren und hiermit in den Datenstrom eingreifen.

View File

@ -1,6 +1,6 @@
# Konsolen Input/Output
## Lernziel
[Musterlösung](solution/)
Daten von der Konsole lesen und über eine Ausgabeumlenkung in eine Datei umlenken. `PrintStream` und `InputStreamReader` einsetzen.

View File

@ -1,6 +1,6 @@
# Zeilen einer Textdatei zählen
## Lernziel
[Musterlösung](solution/)
Dateien zeilenweise lesen und verarbeiten.

View File

@ -1,6 +1,6 @@
# `RandomAccessFile`
## Lernziel
[Musterlösung](solution/)
`RandomAccessFile` sowohl zum Lesen, als auch zum Schreiben von Daten einsetzen. Verstehen, dass man sich wahlfrei durch die Datei bewegen kann.

View File

@ -1,6 +1,6 @@
# `Reader` verwenden
## Lernziel
[Musterlösung](solution/)
Textdaten mithilfe von `Reader` verarbeiten.

View File

@ -1,6 +1,6 @@
# Rot13-Verschlüsselung
## Lernziel
[Musterlösung](solution/)
Funktionsweise und Einsatz von Filtern.

View File

@ -1,6 +1,6 @@
# Datei zerhacken
## Lernziel
[Musterlösung](solution/)
Daten byteweise aus einem Stream lesen.

View File

@ -1,6 +1,6 @@
# Serialisierung
## Lernziel
[Musterlösung](solution/)
Serialisierung einsetzen können, um Objekte zu persistieren und wieder zu laden.

View File

@ -1,6 +1,6 @@
# Comparable implementieren
## Lernziel
[Musterlösung](solution/)
Klasse "comparable" machen.

View File

@ -1,6 +1,6 @@
# Interface Stack entwerfen
## Lernziel
[Musterlösung](solution/)
Ein Interface entwerfen und dieses dann implementieren.

View File

@ -1,6 +1,6 @@
# Interface: Uebersetzer
## Lernziel
[Musterlösung](solution/)
Ein Interface implementieren.

View File

@ -1,6 +1,6 @@
# Interfaces anwenden und entwerfen
## Lernziel
[Musterlösung](solution/)
Ein vorhandenes Interface implementieren und ein eigenes Interface programmieren. Klassen schreiben, die mehrere Interfaces implementieren. Die Kollision von gleichnamigen Interface-Methoden und deren Konsequenzen verstehen.

View File

@ -1,6 +1,6 @@
# StringTransmogrifier
## Lernziel
[Musterlösung](solution/)
Funktionale Interfaces entwerfen und verwenden.

View File

@ -1,6 +1,6 @@
# StringTransmogrifier erweitern
## Lernziel
[Musterlösung](solution/)
Funktionale Interfaces entwerfen und verwenden.

View File

@ -1,6 +1,6 @@
# Deep-Copy mit `clone()`
## Lernziel
[Musterlösung](solution/)
Den Nutzen der `clone()`-Methode verstehen und diese richtig einsetzen. Eine eigene `clone()`-Methode schreiben und eine tiefe Kopie durchführen.

View File

@ -1,6 +1,6 @@
# Clone
## Lernziel
[Musterlösung](solution/)
Den Nutzen der `clone()`-Methode verstehen und diese richtig einsetzen. Eine eigene `clone()`-Methode schreiben und eine tiefe Kopie durchführen.

View File

@ -1,6 +1,6 @@
# `equals()` und `hashCode()` implementieren und nutzen
## Lernziel
[Musterlösung](solution/)
Die Methoden `equals()` und `hashCode()` der Klasse `Object` korrekt überschreiben und nutzen.

View File

@ -1,6 +1,6 @@
# equals und hashCode
## Lernziel
[Musterlösung](solution/)
Die Methoden `equals()` und `hashCode()` der Klasse `Object` korrekt überschreiben und nutzen.

View File

@ -1,6 +1,6 @@
# `toString()`-Methode implementieren
## Lernziel
[Musterlösung](solution/)
Klassen mit einer `toString()`-Methode versehen und diese gegenseitig nutzen.

View File

@ -1,6 +1,6 @@
# Optimierung bei Integer
## Lernziel
[Musterlösung](solution/)
Wrapper-Klassen und deren Optimierungen verstehen.

View File

@ -1,6 +1,6 @@
# Methoden der Wrapper-Klassen
## Lernziel
[Musterlösung](solution/)
Wrapper-Klassen nutzen, um Zahlen umzuwandeln.

View File

@ -1,6 +1,6 @@
# Klasse per Reflection analysieren
## Lernziel
[Musterlösung](solution/)
Reflection einsetzen, um Klassen zu untersuchen.

View File

@ -0,0 +1,5 @@
# Lösung: Klasse per Reflection analysieren
Musterlösung:
[pr2.reflection.analyzer](../../solutions/src/main/java/pr2/reflection/analyzer/)

View File

@ -1,6 +1,6 @@
# Objekte per Reflection erzeugen
## Lernziel
[Musterlösung](solution/)
Objekte per Reflection erzeugen.

View File

@ -0,0 +1,5 @@
# Lösung: Objekte per Reflection erzeugen
Musterlösung:
[pr2.reflection.reflector](../../solutions/src/main/java/pr2/reflection/reflector/)

View File

@ -1,6 +1,6 @@
# Kleinbuchstaben in einem String zählen
## Lernziel
[Musterlösung](solution/)
Streams verwenden.

View File

@ -1,6 +1,6 @@
# Buchstaben in einer Liste von Strings zählen
## Lernziel
[Musterlösung](solution/)
Streams verwenden.

View File

@ -1,6 +1,6 @@
# Kleinbuchstaben in einem String zählen
## Lernziel
[Musterlösung](solution/)
Streams verwenden.

View File

@ -1,6 +1,6 @@
# Liste filtern
## Lernziel
[Musterlösung](solution/)
Daten in Streams filtern.

View File

@ -1,6 +1,6 @@
# Streams mit interner Iteration
## Lernziel
[Musterlösung](solution/)
Einen Stream mit einer internen Iteration verwenden. Die Iteration sowohl mit einem Lambda, als auch mit einer Methodenreferenz durchführen.

View File

@ -1,6 +1,6 @@
# Map und Filter auf Streams
## Lernziel
[Musterlösung](solution/)
Einen Stream durch Map- und Filter-Operationen analysieren und gewünschte Daten extrahieren.

View File

@ -1,6 +1,6 @@
# Map und Reduce auf Streams
## Lernziel
[Musterlösung](solution/)
Die Daten in einem Stream durch Map- und Reduce verdichten.

View File

@ -1,6 +1,6 @@
# Reduce
## Lernziel
[Musterlösung](solution/)
Daten in Streams mit `reduce` aggregieren.

View File

@ -1,6 +1,6 @@
# Summe über reduce bestimmen
## Lernziel
[Musterlösung](solution/)
Daten in Streams mit `reduce` aggregieren.

View File

@ -1,6 +1,6 @@
# Wörter zählen
## Lernziel
[Musterlösung](solution/)
Daten in Streams mit `reduce` aggregieren.

View File

@ -1,6 +1,6 @@
# Fakultät parallel berechnen
## Lernziel
[Musterlösung](solution/)
Berechnungen parallelisieren.

View File

@ -1,6 +1,6 @@
# Thread per interrupt beenden
## Lernziel
[Musterlösung](solution/)
Threads kontrolliert beenden.

View File

@ -1,6 +1,6 @@
# wait und notify benutzen
## Lernziel
[Musterlösung](solution/)
Thread-Koordination über Condition-Variablen.

View File

@ -1,6 +1,6 @@
# Parallele Ausgaben erzeugen
## Lernziel
[Musterlösung](solution/)
Erste Schritte mit Threads.

View File

@ -1,6 +1,6 @@
# Race-Condition finden und beheben
## Lernziel
[Musterlösung](solution/)
In einem gegebenen Programm Race-Conditions finden und durch den Einsatz von kritischen Abschnitten beheben.

View File

@ -1,6 +1,6 @@
# Stack und Heap unterscheiden
## Lernziel
[Musterlösung](solution/)
Unterschied zwischen Stack und Heap bei parallelen Programmen verstehen.

View File

@ -1,6 +1,6 @@
# synchronized verwenden
## Lernziel
[Musterlösung](solution/)
Schlüsselwort `synchronized` verwenden.

View File

@ -1,6 +1,6 @@
# Timer und TimerTask verwenden
## Lernziel
[Musterlösung](solution/)
Klassen aus `java.util.concurrent` verwenden.

View File

@ -1,6 +1,6 @@
# Final anwenden
## Lernziel
[Musterlösung](solution/)
Das Schlüsselwort `final` in seinen verschiedenen Bedeutungen kennenlernen und syntaktisch an die richtigen Stellen schreiben.

View File

@ -1,6 +1,6 @@
# Figur und Rechteck
## Lernziel
[Musterlösung](solution/)
Vererbung sinnvoll einsetzen.

View File

@ -1,6 +1,6 @@
# Figur erweitern
## Lernziel
[Musterlösung](solution/)
Vererbung sinnvoll einsetzen.

View File

@ -1,6 +1,6 @@
# Figur noch einmal erweitern
## Lernziel
[Musterlösung](solution/)
Vererbung sinnvoll einsetzen.

View File

@ -1,6 +1,6 @@
# Konstruktoren schreiben
## Lernziel
[Musterlösung](solution/)
Für eine vorhandene Klasse Konstruktoren schreiben und Konstruktoren sich gegenseitig und auch Konstruktoren der Superklasse aufrufen lassen.

View File

@ -1,6 +1,6 @@
# Polymorphie einsetzen
## Lernziel
[Musterlösung](solution/)
Durch Polymorphie Subklassen wie Basisklassen behandeln können.

View File

@ -1,6 +1,6 @@
# Singleton
## Lernziel
[Musterlösung](solution/)
Das Design-Pattern _Singleton_ einsetzen.

View File

@ -1,6 +1,6 @@
# Statische Methoden und Attribute
## Lernziel
[Musterlösung](solution/)
Eine Klasse mit statischen Attributen und Methoden entwickeln und die Unterschiede zu normalen Methoden und Attributen verstehen.

View File

@ -1,6 +1,6 @@
# Methode überladen
## Lernziel
[Musterlösung](solution/)
Methoden überladen.

View File

@ -1,6 +1,6 @@
# Methoden überschreiben
## Lernziel
[Musterlösung](solution/)
Bei Vererbung das Überschreiben von Methoden einsetzen.

View File

@ -1,6 +1,6 @@
# Varag-Methode schreiben
## Lernziel
[Musterlösung](solution/)
Eine Varag-Methode schreiben.

View File

@ -1,6 +1,6 @@
# Vererbung von Figuren
## Lernziel
[Musterlösung](solution/)
Einfache Klassen schreiben und eine Vererbungshierarchie bilden.

196
readme.md
View File

@ -23,101 +23,101 @@ Hinweise zur nötigen Softwareausstattung finden Sie [hier](help/softwareausstat
| 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) | |
| 13. | Vererbung | [Figur und Rechteck](Vererbung_002/readme.md) | |
| 14. | Vererbung | [Figur erweitern](Vererbung_003/readme.md) | |
| 15. | Vererbung | [Figur noch einmal erweitern](Vererbung_004/readme.md) | |
| 16. | Vererbung | [Konstruktoren schreiben](Vererbung_005/readme.md) | |
| 17. | Vererbung | [Polymorphie einsetzen](Vererbung_006/readme.md) | |
| 18. | Vererbung | [Singleton](Vererbung_007/readme.md) | |
| 19. | Vererbung | [Statische Methoden und Attribute](Vererbung_008/readme.md) | |
| 20. | Vererbung | [Methode überladen](Vererbung_009/readme.md) | |
| 21. | Vererbung | [Methoden überschreiben](Vererbung_010/readme.md) | |
| 22. | Vererbung | [Varag-Methode schreiben](Vererbung_011/readme.md) | |
| 23. | Vererbung | [Vererbung von Figuren](Vererbung_012/readme.md) | |
| 24. | Abstrakte Klassen | [Abstrakte Klassen](Abstrakte_Klassen_001/readme.md) | |
| 25. | Abstrakte Klassen | [Abstrakte Klasse](Abstrakte_Klassen_002/readme.md) | |
| 26. | Interfaces | [Comparable implementieren](Interfaces_001/readme.md) | |
| 27. | Interfaces | [Interface Stack entwerfen](Interfaces_002/readme.md) | |
| 28. | Interfaces | [Interface: Uebersetzer](Interfaces_003/readme.md) | |
| 29. | Interfaces | [Interfaces anwenden und entwerfen](Interfaces_004/readme.md) | |
| 30. | Object und Wrapper | [Deep-Copy mit `clone()`](Object_und_Wrapper_001/readme.md) | |
| 31. | Object und Wrapper | [Clone](Object_und_Wrapper_002/readme.md) | |
| 32. | Object und Wrapper | [`equals()` und `hashCode()` implementieren und nutzen](Object_und_Wrapper_003/readme.md) | |
| 33. | Object und Wrapper | [equals und hashCode](Object_und_Wrapper_004/readme.md) | |
| 34. | Object und Wrapper | [`toString()`-Methode implementieren](Object_und_Wrapper_005/readme.md) | |
| 35. | Object und Wrapper | [Optimierung bei Integer](Object_und_Wrapper_006/readme.md) | |
| 36. | Object und Wrapper | [Methoden der Wrapper-Klassen](Object_und_Wrapper_007/readme.md) | |
| 37. | Enumerationen | [Eigene Enumeration schreiben und verwenden](Enumerationen_001/readme.md) | |
| 38. | Enumerationen | [Enumeration schreiben](Enumerationen_002/readme.md) | |
| 39. | Enumerationen | [Singleton-Eigenschaft von Enumerationen](Enumerationen_003/readme.md) | |
| 40. | Enumerationen | [Stein, Papier, Schere, Echse, Spock](Enumerationen_004/readme.md) | |
| 41. | Ausnahmen | [Ausnahmen testen](Ausnahmen_001/readme.md) | |
| 42. | Ausnahmen | [Eigene Ausnahmen schreiben und an entsprechender Stelle werfen](Ausnahmen_002/readme.md) | |
| 43. | Ausnahmen | [Eigene Exception schreiben](Ausnahmen_003/readme.md) | |
| 44. | Ausnahmen | [Handle-or-Declare-Regel anwenden](Ausnahmen_004/readme.md) | |
| 45. | Ausnahmen | [Ausnahmen mit `try` und `catch` behandeln.](Ausnahmen_005/readme.md) | |
| 46. | Input und Output | [`BufferedReader` zum zeilenweisen Lesen einsetzen](Input_und_Output_001/readme.md) | |
| 47. | Input und Output | [DataOutputStream](Input_und_Output_002/readme.md) | |
| 48. | Input und Output | [DataOutputStream durch Serialisierung ersetzen](Input_und_Output_003/readme.md) | |
| 49. | Input und Output | [Daten mit `DataOutputStream` und `DataInputStream` verarbeiten](Input_und_Output_004/readme.md) | |
| 50. | Input und Output | [Daten mit einem `InputStream` lesen](Input_und_Output_005/readme.md) | |
| 51. | Input und Output | [Daten mit einem `OutputStream` schreiben](Input_und_Output_006/readme.md) | |
| 52. | Input und Output | [Filesystem-Abstraktion mit `File`](Input_und_Output_007/readme.md) | |
| 53. | Input und Output | [Fileattribute lesen](Input_und_Output_008/readme.md) | |
| 54. | Input und Output | [`FilterReader`](Input_und_Output_009/readme.md) | |
| 55. | Input und Output | [Konsolen Input/Output](Input_und_Output_010/readme.md) | |
| 56. | Input und Output | [Zeilen einer Textdatei zählen](Input_und_Output_011/readme.md) | |
| 57. | Input und Output | [`RandomAccessFile`](Input_und_Output_012/readme.md) | |
| 58. | Input und Output | [`Reader` verwenden](Input_und_Output_013/readme.md) | |
| 59. | Input und Output | [Rot13-Verschlüsselung](Input_und_Output_014/readme.md) | |
| 60. | Input und Output | [Datei zerhacken](Input_und_Output_015/readme.md) | |
| 61. | Input und Output | [Serialisierung](Input_und_Output_016/readme.md) | |
| 62. | Generische Typen | [Einen generischen Typ schreiben](Generische_Typen_001/readme.md) | |
| 63. | Generische Typen | [Generische Klasse Pair schreiben](Generische_Typen_002/readme.md) | |
| 64. | Generische Typen | [Generische Klasse Pair erweitern: NumberPair](Generische_Typen_003/readme.md) | |
| 65. | Generische Typen | [Generische Klasse Pair erweitern: SamePair](Generische_Typen_004/readme.md) | |
| 66. | Generische Typen | [PairList](Generische_Typen_005/readme.md) | |
| 67. | Generische Typen | [Wildcard benutzen](Generische_Typen_006/readme.md) | |
| 68. | Generische Typen | [Generische Queue](Generische_Typen_007/readme.md) | |
| 69. | Generische Typen | [`super` und `extends` einsetzen](Generische_Typen_008/readme.md) | |
| 70. | Generische Typen | [Generische Typen zusammen mit Wildcards einsetzen](Generische_Typen_009/readme.md) | |
| 71. | Geschachtelte Klassen | [Eigene compare-Methode schreiben](Geschachtelte_Klassen_001/readme.md) | |
| 72. | Geschachtelte Klassen | [Innere Klasse Beobachter](Geschachtelte_Klassen_002/readme.md) | |
| 73. | Geschachtelte Klassen | [Callback mit anonymer Klasse realisieren](Geschachtelte_Klassen_003/readme.md) | |
| 74. | Lambdas | [Comparator als Lambda](Lambdas_001/readme.md) | |
| 75. | Lambdas | [Callback mit Lambda realisieren](Lambdas_002/readme.md) | |
| 76. | Geschachtelte Klassen | [MatrixSuche](Geschachtelte_Klassen_001/readme.md) | |
| 77. | Lambdas | [StringTransmogrifier](Lambdas_001/readme.md) | |
| 78. | Lambdas | [StringTransmogrifier erweitern](Lambdas_002/readme.md) | |
| 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) | |
| 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<T>` und dessen Implementierungen](Collections_003/readme.md) | [](Collections_003/solution/) |
| 82. | Collections | [`Map<T>` 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<T>` 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<T>` 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/) |

View File

@ -0,0 +1,79 @@
package pr2.collections.iterator;
import java.util.Iterator;
/**
* Eine einfache, naive Stack Implementierung.
*
* @param <T> Typ, der gespeichert werden soll.
*/
public class SimpleStack<T> implements Iterable<T> {
// Variablen sind nicht private wegen Zugriff durch den Iterator
T[] stack;
int pos;
/**
* Legt einen neuen Stack mit der gegebenen Größe an.
*
* @param size Größe des Stacks.
*/
@SuppressWarnings("unchecked")
public SimpleStack(int size) {
stack = (T[]) new Object[size];
pos = 0;
}
/**
* Fügt dem Stack ein neues Element hinzu.
*
* @param o Element, das hinzugefügt werden soll.
*/
public void push(T o) {
stack[pos++] = o;
}
/**
* Holt das oberste Element und entfernt es.
*
* @return das oberste Element
*/
public T pop() {
return stack[--pos];
}
/**
* Gibt das oberste Element zurück, ohne es zu entfernen.
*
* @return das oberste Element
*/
public T peek() {
return stack[pos - 1];
}
/**
* Erzeugt einen Iterator.
*
* @return Iterator
* @see java.lang.Iterable#iterator()
*/
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
int iteratorPos = pos - 1;
@Override
public boolean hasNext() {
return iteratorPos >= 0;
}
@Override
public T next() {
return stack[iteratorPos--];
}
};
}
}

View File

@ -0,0 +1,123 @@
package pr2.collections.list;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
* Klassen, um die in einem Text vorkommenden Wörter zu sammeln.
*/
public class WordCollector {
/**
* Listet alle Worte in der Datei alphabetisch auf. Duplikate werden
* entfernt. Die Wörter werden in Kleinbuchstaben umgewandelt.
*
* @param filename Dateiname
* @return die Liste der vorhandenen Worte
* @throws IOException Fehler beim Dateizugriff.
*/
public static List<String> listWords(String filename) throws IOException {
List<String> allWords = readFileAndSplitIntoWords(filename);
List<String> result = removeDuplicates(allWords);
return result;
}
/**
* Listet alle Worte in der Datei auf.
*
* @param filename Dateiname
* @return die Liste der vorhandenen Worte
* @throws IOException Fehler beim Dateizugriff.
*/
private static List<String> readFileAndSplitIntoWords(String filename)
throws IOException {
// Datei zum Lesen öffnen
BufferedReader reader = new BufferedReader(new FileReader(filename));
String line; // aktuelle Zeile
List<String> wordList = new LinkedList<>();
// Über die Zeilen der Datei iterieren
while ((line = reader.readLine()) != null) {
// Sonderzeichen entfernen und die Zeilen in Worte splitten
line = line.toLowerCase();
line = line.replaceAll("[\",.:'\\-!?]", "");
String[] words = line.toLowerCase().split("[,. ]");
// Worte in den Puffer übertragen
wordList.addAll(Arrays.asList(words));
}
reader.close();
return wordList;
}
/**
* Sortiert das übergebene Array alphabetisch und entfernt Duplikate.
*
* @param input Eingabe Array
* @return sortiertes und bereinigtes Array
*/
@SuppressWarnings("PMD.AvoidReassigningLoopVariables")
private static List<String> removeDuplicates(List<String> input) {
// Eingabe-Liste kopieren
List<String> strings = new ArrayList<>(input);
// Liste sortieren
Collections.sort(strings);
// Über die Einträge laufen
for (int i = 0; i < strings.size(); i++) {
String word = strings.get(i);
// Über die Einträge laufen
for (int k = i + 1; k < strings.size(); k++) {
String otherWord = strings.get(k);
if (otherWord.compareTo(word) > 0) {
// Sind schon hinter der möglichen Position
break;
}
else if (otherWord.equals(word)) {
// Duplikat, entfernen
strings.remove(k);
k--;
}
}
}
return strings;
}
/**
* Hauptmethode.
*
* @param args Kommandozeilen-Argumente.
*/
public static void main(String[] args) {
try {
List<String> words = listWords(
"kafka.txt");
System.out.println(words);
} catch (IOException e) {
System.err.println("Probleme beim Dateizugriff: " + e);
}
}
}

Some files were not shown because too many files have changed in this diff Show More