Files
EP2/angabe/Aufgabenblatt5.md

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 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 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 von BodyLinkedList dadurch, dass der Elementtyp statt Body der Obertyp Massive 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 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