5.3 KiB
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 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 einerdefault
-Implementierung definiert. Dieser Programmcode wird ausgeführt, falls die entsprechende Klasse (Body
oderNamedBody
) über keine eigene Definition der Methode verfügt. Verändern Sie diese Datei bitte nicht. - NamedBody ist das Gerüst einer Klassendefinition. Die Klasse repräsentiert Himmelskörper, die einen Namen haben.
- MassiveLinkedList ist das Gerüst für eine Implementierung einer
verketteten Liste von
Massive
-Objekten. Die Liste unterscheidet sich vonBodyLinkedList
dadurch, dass der Elementtyp stattBody
der ObertypMassive
ist. - MassiveForceHashMap ist das Gerüst für eine Implementierung
einer assoziativen Datenstruktur, die ein
Massive
-Objekt mit der auf das Objekt wirkenden Kraft assoziiert. - Simulation5 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 nicht überschreiben müssen). - Aufgabe5Test 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
undNamedBody
(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 Methodenequals
undhashCode
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)
- Wie könnte man vorgehen, wenn man - wie in früheren Simulationen - Himmelskörper im Fall von Kollisionen verschmelzen will?
- Was ändert sich am Verhalten von
MassiveForceHashMap
, wenn man inBody
die Methodenequals
undhashCode
überschreiben würde?
Punkteaufteilung
-
Implementierung von
Massive
inNamedBody
: 1 Punkt -
Implementierung von
Massive
inBody
: 0.5 Punkt -
Implementierung von
MassiveForceHashMap
: 2 Punkte -
Implementierung von
MassiveLinkedList
: 0.5 Punkte -
Implementierung von
Simulation5
: 1 Punkte -
Gesamt: 5 Punkte