103 lines
5.3 KiB
Markdown
103 lines
5.3 KiB
Markdown
# Aufgabenblatt 5
|
|
|
|
## Allgemeine Anmerkungen
|
|
|
|
Ihre Lösung für dieses Aufgabenblatt ist bis Montag, 9.5. 11h durch `git commit` und `git push`
|
|
abzugeben. Mit der Angabe werden die Dateien `Massive.java`, `NamedBody.java`, `MassiveLinkedList.java`,
|
|
`MassiveForceHashMap.java`, `Simulation5.java` und `Aufgabe5Test.java` mitgeliefert.
|
|
|
|
Wenn Sie zusätzlich zu den gefragten Klassen weitere Klassen definieren, achten Sie darauf, dass
|
|
die Klassennamen mit `My` beginnen, um Konflikte mit späteren Aufgabenblättern zu vermeiden.
|
|
|
|
## Ziel
|
|
|
|
Ziel der Aufgabe ist die Anwendung der Konzepte: Gleichheit und Hash-Werte, Hash-Tabelle
|
|
(siehe Skriptum Seite 85-91).
|
|
|
|
## Beschreibung der gegebenen Dateien
|
|
|
|
- [Massive](../src/Massive.java) ist ein Interface, das Himmelskörper (als kohärente Massen)
|
|
beschreibt. `Massive` ist der gemeinsame Obertyp für verschiedene Klassen von Himmelkörpern. Die
|
|
meisten spezifizierten Methoden sind mit einer `default`-Implementierung definiert. Dieser
|
|
Programmcode wird ausgeführt, falls die entsprechende Klasse (`Body` oder `NamedBody`) über keine
|
|
eigene Definition der Methode verfügt. Verändern Sie diese Datei bitte nicht.
|
|
- [NamedBody](../src/NamedBody.java) ist das Gerüst einer Klassendefinition. Die Klasse
|
|
repräsentiert Himmelskörper, die einen Namen haben.
|
|
- [MassiveLinkedList](../src/MassiveLinkedList.java) ist das Gerüst für eine Implementierung einer
|
|
verketteten Liste von `Massive`-Objekten. Die Liste unterscheidet sich von `BodyLinkedList`
|
|
dadurch, dass der Elementtyp statt `Body` der Obertyp `Massive` ist.
|
|
- [MassiveForceHashMap](../src/MassiveForceHashMap.java) ist das Gerüst für eine Implementierung
|
|
einer assoziativen Datenstruktur, die ein `Massive`-Objekt mit der auf das Objekt wirkenden Kraft
|
|
assoziiert.
|
|
- [Simulation5](../src/Simulation5.java) ist ein Gerüst für eine ausführbare Klasse. Hier soll
|
|
die Simulation analog zur Klasse `Simulation` implementiert werden (damit Sie Ihre [ursprüngliche
|
|
Datei](../src/Simulation.java) nicht überschreiben müssen).
|
|
- [Aufgabe5Test](../src/Aufgabe5Test.java) ist eine vorgegebene Klasse, die Sie zum Testen Ihrer
|
|
Implementierung verwenden sollten. Bei einer fehlerfreien Implementierung sollten bei der
|
|
Ausführung dieser Klasse keine Exceptions geworfen werden und alle Tests als erfolgreich ("successful")
|
|
ausgegeben werden. Entfernen Sie die Kommentarzeichen, um diese Klasse verwenden zu können. Sie
|
|
müssen diese Klasse nicht weiter verändern, können aber eigene Testfälle hinzufügen.
|
|
|
|
## Aufgaben
|
|
|
|
Ihre Aufgaben sind folgende:
|
|
|
|
**1. Implementieren Sie `Massive` in den Klassen `Body` und `NamedBody`.**
|
|
|
|
Passen Sie die bestehende Definition von `Body` so an, dass die Klasse `Massive` implementiert wird.
|
|
Vervollständigen Sie auch `NamedBody` so, dass sie `Massive` implementiert und die vorgegebene
|
|
Spezifikationen der Methoden erfüllt.
|
|
|
|
**2. Überschreiben von `equals` und `hashCode` in `NamedBody`:**
|
|
|
|
Überschreiben Sie in `NamedBody` die Methoden `equals` und `hashCode` gemäß der dort angeführten
|
|
Spezifikation. Achten Sie bei der Implementierung darauf, dass die in der Klasse `Object`
|
|
beschriebenen Bedingungen für `equals` und `hashCode` eingehalten werden. `equals` und `hashCode`
|
|
müssen zusammen passen.
|
|
|
|
**3. Vervollständigen von `MassiveLinkedList`:**
|
|
|
|
Definieren Sie `MassiveLinkedList`. Die Klasse ist wie `BodyLinkedList` aufgebaut, mit dem
|
|
Unterschied, dass der Elementtyp statt `Body` nun der Typ `Massive` ist. Die Methode `indexOf`
|
|
vergleicht Objekte mittels `equals`.
|
|
|
|
**4. Implementierung von `MassiveForceHashMap`:**
|
|
|
|
Vervollständigen Sie die Definition der Klasse `MassiveForceHashMap`, die eine Hash-Tabelle
|
|
mit Schlüssel vom Typ `Massive` und Wert vom Typ `Vector3` implementiert. Die Klasse ist ähnlich
|
|
zur Klasse `BodyForceTreeMap`. Die Unterschiede sind:
|
|
- Der Typ des Schlüssels ist der gemeinsame Obertyp von `Body` und `NamedBody` (`Massive`).
|
|
Dadurch lassen sich Objekte beider Klassen gemeinsam in der Hash-Tabelle speichern.
|
|
- Die Schlüssel-Werte-Paare sind nicht nach Masse sortiert. Stattdessen wird der Hash-Wert zur
|
|
Suche benutzt.
|
|
- Es gibt eine zusätzliche Methode `keyList()`. Die Methoden `equals` und `hashCode` werden
|
|
redefiniert.
|
|
|
|
**5. Implementierung von `Simulation5`:**
|
|
|
|
Implementieren Sie die Simulationsschleife unter Verwendung eines Objekts vom Typ
|
|
`MassiveForceHashMap`. Die Methode `keyList()` hilft beim Iterieren der Hash-Tabelle.
|
|
Kollisionen von Himmelskörpern müssen in dieser Simulation nicht berücksichtigt werden.
|
|
|
|
### Hinweise:
|
|
|
|
- Verwenden Sie bei der Implementierung von `MassiveForceHashMap` eine geeignete Kollisionsbehandlung
|
|
für gleiche Hash-Werte. Als Vorlage können Sie den Beispielcode aus dem Skriptum nutzen.
|
|
|
|
### Denkanstöße (ohne Bewertung)
|
|
|
|
1. Wie könnte man vorgehen, wenn man - wie in früheren Simulationen - Himmelskörper im Fall von
|
|
Kollisionen verschmelzen will?
|
|
2. Was ändert sich am Verhalten von `MassiveForceHashMap`, wenn man in `Body` die Methoden
|
|
`equals` und `hashCode` überschreiben würde?
|
|
|
|
#### _Punkteaufteilung_
|
|
|
|
- Implementierung von `Massive` in `NamedBody`: 1 Punkt
|
|
- Implementierung von `Massive` in `Body`: 0.5 Punkt
|
|
- Implementierung von `MassiveForceHashMap`: 2 Punkte
|
|
- Implementierung von `MassiveLinkedList`: 0.5 Punkte
|
|
- Implementierung von `Simulation5`: 1 Punkte
|
|
|
|
- Gesamt: 5 Punkte
|