assignments/Assignment_009/readme.md

32 lines
2.9 KiB
Markdown

# Eine Menge Mengen, bloß nicht vermengen
**🎓 Benotetes Assignment 🎓**
📆 **Fällig: 16.12.2025** 📆
Die Platte ist komprimiert, Battlefield 6 installiert und Sie zocken vor lauter Glück über Ihr tolles Kompressionsprogramm mehrere Nächte durch. Das Studium leidet, aber im Gegenzug steigen Sie immer weiter in den Rängen des Spiels auf. Wer braucht schon einen Bachelor of Science, wenn man sich durch 100 Ranks leveln kann.
Plötzlich passiert es, Sie werden vom Sekundenschlaf erwischt und schlafen mit dem Kopf auf der Tastatur ein. Es war wohl doch zu viele die letzten Tage. Ihre Nase produziert wilde Zeichen im Discord-Chat und die anderen Spieler beschimpfen Sie auf Russisch. Aber Sie bekommen nichts mehr davon mit, so süß sind Ihre Träume.
In Ihrem Traum werden Sie ins Wunderland verschleppt und der verrückte Hutmacher will, dass Sie ein Programm für ihn schreiben. Er wäre nicht der verrückte Hutmacher, wenn dieses Programm nicht sehr spezifische Anforderungen hätte. Oder ist es vielleicht gar nicht der Hutmacher, der Sie da quält?
## MySet
Gehen Sie in das Paket [pr2.generics.set](../sources/src/main/java/pr2/generics/set/).
Sie sollen das Interface `Set` implementieren, das die Operationen auf einer **Menge** definiert. Das Interface `Set` ist aber noch nicht generisch, d.h. bevor Sie die Implementierung beginnen, müssen Sie das Interface zu einem `Set<T>` umbauen, sodass man typsicher damit umgehen kann.
Ausgehend vom angepassten Interface `Set<T>` implementieren Sie die Methoden in der Klasse `MySet<T>`.
Für die interne Speicherung der Daten verwenden Sie bitte die vorgegebene Klasse `Bag`, um sich die Arbeit zu erleichtern und nicht mit Arrays arbeiten zu müssen.
Bitte beachten Sie die folgenden Regeln für die Implementierung:
* Achten Sie bei den Methoden von `Set` darauf, dass diese **möglichst flexibel** mit den Typen umgehen, d.h. verwenden Sie, wo immer möglich, Wildcards anstatt des Typparameters `T`. Denken Sie an die Verwendung von `extends` und `super` im Zusammenhang mit Wildcards `?`.
* Verwenden Sie **keine Klassen aus dem Collection API**, d.h. Sie dürfen nicht auf `java.util.Set`, `java.util.List` etc. zurückgreifen. Ihre darunterliegende Speicherung wird von `Bag` übernommen.
* Implementieren Sie **zuerst die beiden Methoden** `each` und `test`.
* Außerhalb der Methoden `each` und `test` darf es **keine Schleifen (`for`, `while`)** in Ihrer Klasse geben. Sie müssen alle Operationen, welche eine Iteration (Schleife) brauchen, auf diese beiden Methoden abbilden. Hierzu verwenden Sie bitte geschickt Lambdas, die Sie (wo sinnvoll) an die `each`- und `test`-Methode übergeben und darin dann die notwendigen Operationen durchführen.
## UnitTests
Schreiben Sie JUnit-Tests in der Klasse [pr2.generics.set.TestMySet](../../solutions/src/test/java/pr2/generic/set/TestMySet), welche Ihre Implementierung ausgiebig testen. Hierbei sollten alle Methoden getestet werden, die das Interface vorgibt.