Micha: Referenz in Map und Liste ablegen?

Hi,

ich arbeite an einem kleinen Tool, welches mit gemessenen 3D-Punkten arbeitet. Diese Punkte lese ich in eine HashMap ein und gebe als Schlüssel die Punktnummer an. Der Wert selbst ist wiederum ein eigenes Punktobjekt.

Vorteil ist, das ich über die Punktnummer sehr bequem an den jeweiligen Punkt komme um diesen zu bearbeiten. Nachteilig ist, dass sie "unsortiert" in dieser Map stehen. Ein Vector oder eine ArrayList böten hingegen den Vorteil einer "geordneten" Struktur. Um aber an einen bestimmten Punkt zu kommen, müsste ich immer in einer Schlefe nach diesem suchen.

Macht es Sinn (und ist es speichertechnisch überhaupt empfehlenswert), um die Vorteile beider zu nutzen, die erzeugten Punktobjekte bzw. dessen Referenz sowohl in einer Map als auch in einer Liste zu hinterlegen oder bietet Java noch ein ähnliches Speichermedium, welches ich übersehen habe und bereits meinen Wunsch beinhaltet?

Mit freundlichem Gruß
Micha

  1. Hello,

    Macht es Sinn (und ist es speichertechnisch überhaupt empfehlenswert), um die Vorteile beider zu nutzen, die erzeugten Punktobjekte bzw. dessen Referenz sowohl in einer Map als auch in einer Liste zu hinterlegen oder bietet Java noch ein ähnliches Speichermedium, welches ich übersehen habe und bereits meinen Wunsch beinhaltet?

    du könntest deiner HashMap einen eigenen Iterator besorgen, der die Werte in einer dir sinnvoll erscheinenen Reihenfolge liefert, sofern die Punktnummer dafür nicht ausreicht (sonst täte es wohl auch der Standarditerator auf den Keys).

    MfG
    Rouven

    --
    -------------------
    Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
    1. Hallo Rouven,

      vielen Dank für Deine Antwort.

      du könntest deiner HashMap einen eigenen Iterator besorgen, der die Werte in einer dir sinnvoll erscheinenen Reihenfolge liefert

      Die Reihenfolge wäre die, die beim Erstellen vorgegeben wurde. Um eine Schleife mit Bedingung(en) oder einem zusätzlichen Speichern der Reihenfolge käme ich hier afaik auch nicht drum rum - zumindest reicht mein Wissen für Alternativen nicht ;-)

      sofern die Punktnummer dafür nicht ausreicht (sonst täte es wohl auch der Standarditerator auf den Keys).

      Reichen nur bedingt. Beim Rechnen nutzt ich nur die Koordinatenelemente. Da geht kurz die Beziehung zum Punkt verloren, die ich dann nach jeder Iteration wieder herstelle; hierfür fände ich die Liste recht bequem ;-)

      Mit freundlichem Gruß
      Micha

  2. Hallo Micha,

    Macht es Sinn (und ist es speichertechnisch überhaupt empfehlenswert), um die Vorteile beider zu nutzen, die erzeugten Punktobjekte bzw. dessen Referenz sowohl in einer Map als auch in einer Liste zu hinterlegen.

    Ja, und wenn sich diese Daten nicht ändern, dürfte das sogar die effizienteste Methode sein. Mehr Speicherplatz als andere Lösungen benötigt das wahrscheinlich auch nicht, und ArrayLists sind meist am effizientesten und erlauben auch noch wahlfreien Zugriff.

    oder bietet Java noch ein ähnliches Speichermedium, welches ich übersehen habe und bereits meinen Wunsch beinhaltet?

    Ja, die Klasse {link:http://java.sun.com/javase/6/docs/api/java/util/LinkedHashMap.html@LinkedHashMap]

    Allerdings musst Du da die Punkte in der richtigen Reihenfolge einfügen, Du kannst nicht per Index zugreifen und langsamer als das iterieren über eine ArrayList dürfte das auch sein.
    Wenn Du die Daten oft änderst, könnte das aber Vorteile haben. Vor allem musst Du Dir nicht selbst überlegen, wie Du das organisierst ;-)

    Grüße

    Daniel

    1. Hallo Daniel Thoma,

      Ja, und wenn sich diese Daten nicht ändern, dürfte das sogar die effizienteste Methode sein.

      Die Daten, das heißt die Koordinaten der Punkte selbst, ändern sich schon. Ein Punktobjekt P bleibt aber dabei immer an der selben Stelle und lediglich seine x,y und z-Komponenten ändern sich. Das wird, wenn ich Deine Aussage richtig verstehe, aber egal sein, da der Punkt als solches ja "Bestand" hat.

      oder bietet Java noch ein ähnliches Speichermedium, welches ich übersehen habe und bereits meinen Wunsch beinhaltet?
      Ja, die Klasse LinkedHashMap

      Schau ich mir an, Danke!

      Allerdings musst Du da die Punkte in der richtigen Reihenfolge einfügen,

      Die Reihenfolge wird beim Einlesen der Daten vorgegeben. Mir ist hier vor allem wichtig, das ein Punkt, der den Index a hat, diesen auch am Ende noch hat. Sind die Punkte gelesen, werden keine weiteren hinzugefügt, da für alle Punkte Näherungskoordinaten benötigt werden.

      Wenn Du die Daten oft änderst, könnte das aber Vorteile haben. Vor allem musst Du Dir nicht selbst überlegen, wie Du das organisierst ;-)

      Hört sich gut an ;-)

      Mit freundlichem Gruß
      Micha

      1. Hallo Micha,

        Deine Aussage richtig verstehe, aber egal sein, da der Punkt als solches ja "Bestand" hat.

        Ja klar, es darf sich nichts an den Datenstrukturen ändern. Eigenschaften der Objekte (zumindest solche, die nicht für die Zuordnung relevant sind), dürfen sich natürlich ändern.

        Grüße

        Daniel

        1. Hallo Daniel Thoma,

          funktioniert bestens! Vielen Dank noch einmal.

          Mit freundlichem Gruß
          Micha