Smart: Map/Liste

Hi,

ich muss einige Wertepaare (key, value) hintereinander in einer Liste speichern. Die Reihenfolge sollte beim Eintragen nicht verändert werden.

Treemap sortiert die "Keys" ja automatisch. Haschmap fügt die Werte irgendwo in der Liste, daher stimmt die Reihenfolge hinterher nicht mehr. Gibt es einen anderen Weg, dies zu erreichen?

Danke im Voraus
Gruß

  1. [...]
    Treemap sortiert die "Keys" ja automatisch. Haschmap fügt die Werte irgendwo in der Liste, daher stimmt die Reihenfolge hinterher nicht mehr. Gibt es einen anderen Weg, dies zu erreichen?

    Du musst dafür sorgen, dass die Schlüssel der Treemap so gestaltet sind, dass sie nach dem "Ablegezeitpunkt" in der Map sortiert sind. Dafür kannst Du entweder einen Comparator implementieren, der die Schlüssel entsprechend sortieren kann, oder Deine Schlüssel sind Comparable und bringen die Sortierfunktion damit "natural" (s. API Documentation) mit. Du wirst aber nicht drum rum kommen, Deinen Schlüsseln (die vermutlich jetzt noch nichts über den Zeitpunkt der Ablage in der Map wissen) die Eigenschaft mitzugeben, wann sie in der Map hinzugefügt wurden.
    Wäre denn ein eigenes Objekt hier nicht passender? in diesem Objekt könntest Du mit zwei Maps arbeiten (eine für die Verbindung key -> value, eine für reihenfolge -> key) oder mit einer Map und einer List (Map für key -> value, List für die Reihenfolge per Index).

    Schöne Grüße,

    Peter

    1. Hallo Peter,

      danke für deine Hilfe.

      Das mit dem Object ist eine sehr gute Idee. Hast eventuell ein Beispiel parat?

      Gruß

      1. [...]
        Das mit dem Object ist eine sehr gute Idee. Hast eventuell ein Beispiel parat?

        Nein, da ich ein solches Problem noch nicht hatte, kann ich Dir nicht mit einem Beispiel dienen. Sollte aber mit überschaubarem Aufwand machbar sein.

        public class BlablaContainer {
            private List<String> keys;
            private Map<String, BlablaObject> backingMap;

        public BlablaContainer() {
                // initialize List and Map
            }

        public void put(String key, BlablaObject value) {
                keys.add(key);
                backingMap.put(key, value);
            }

        // more reading and writing methods
        }

        Die anderen Methoden, die Du anbieten willst, musst Du halt noch definieren. Da kommts darauf an, was das Ding machen soll.

        Schöne Grüße,

        Peter

        1. Hallo Peter,

          vielen Dank nochmals. Es hat geklappt. Ich habe momentan höchtens 3 Wertepaare, die richtig in einer XML-Datei speichern muss. Jedenfalls werden die Paare in richtiger Reihenfolge gespeichert. Vielleicht muss ich ein neues Thread öffnen. Aber weisst du eventuell man am leichtens die XML-Daten Strukturiert speichern kann? Momentan benutze ich das hier:

          FileOutputStream out = new FileOutputStream(pfad + dateiname);
          XMLOutputter serializer = new XMLOutputter();
          serializer.output(doc, out);
          out.flush();
          out.close();

          Das funktioniert zwar, die Knoten werden aber in einer Zeile hintereinander gespeichert. Das Lesen wird aber hinetrher sehr schwer.

          Gruß

          1. Servus,

            [...]
            FileOutputStream out = new FileOutputStream(pfad + dateiname);
            XMLOutputter serializer = new XMLOutputter();
            serializer.output(doc, out);
            out.flush();
            out.close();

            Das funktioniert zwar, die Knoten werden aber in einer Zeile hintereinander gespeichert. Das Lesen wird aber hinetrher sehr schwer.

            Der XMLOutputter sieht nach JDOM aus, deshalb gehe ich davon aus, dass Du das verwendest. Hier kannst Du dem XMLOutputter über die Methode setFormat(Format) und dem Format#getPrettyFormat() eine aufgehübschte Variante bekommen.
            Das Lesen wird dann hinterher aber nur für den menschlichen Anwender leichter, einer Maschine ist es wurscht (sollte es wurscht sein), ob das XML formatiert ist oder nicht.

            Schöne Grüße,

            Peter

            1. Guten Morgen,

              oh man bin ich gut ;-).

              Vielen Dank. Die Daten werden ganz sauber reingeschrieben. Ein problem ist noch da. Die Spitze Klammer werden als "&lt;" und "/&gt;" gespeichert. Kann man dies verhindern?

              Gruß

              1. [...]
                Vielen Dank. Die Daten werden ganz sauber reingeschrieben. Ein problem ist noch da. Die Spitze Klammer werden als "&lt;" und "/&gt;" gespeichert. Kann man dies verhindern?

                Du meinst, in dem Text, den Du innerhalb eines Elements notierst, werden die spitzen Klammern markiert. Das muss so sein, weil innerhalb eines öffnenden und schließenden Tags keine spitzen Klammern stehen dürfen, da sie als Markup gewertet werden (außer, der Text innerhalb des Tags befindet sich in einer PCDATA Anweisung. Ich kann mir schon vorstellen, dass das mit JDOM geht, allerdings habe ich mit der Bibliothek keine praktischen Erfahrungen. Ich würde vermuten, dass man dem Document beim Erzeugen des Elements sagen muss, dass es sich nicht um ein Text-Child, sondern ein PCDATA-Child handelt. Mach Dich mal in der API- und sonstigen Dokumentation von JDOM schlau.

                Schöne Grüße,

                Peter

  2. Tach,

    ich muss einige Wertepaare (key, value) hintereinander in einer Liste speichern. Die Reihenfolge sollte beim Eintragen nicht verändert werden.

    Treemap sortiert die "Keys" ja automatisch. Haschmap fügt die Werte irgendwo in der Liste, daher stimmt die Reihenfolge hinterher nicht mehr. Gibt es einen anderen Weg, dies zu erreichen?

    ja, dafür gibt es die Klasse LinkedHashMap.

    mfg
    Woodfighter

    1. [...]
      ja, dafür gibt es die Klasse LinkedHashMap.

      Sehr interessant, die Klasse habe ich noch nicht verwendet. Bei einem erneuten "put" wird zwar die ursprüngliche Reihenfolge beibehalten, aber vielleicht reicht das dem OP ja aus.

      Schönes Wochenende!

      Peter

      1. Tach,

        Bei einem erneuten "put" wird zwar die ursprüngliche Reihenfolge beibehalten, aber vielleicht reicht das dem OP ja aus.

        das war doch genau, was er wollte.

        mfg
        Woodfighter

        1. Guten Morgen,

          [...]
          das war doch genau, was er wollte.

          Das kann ich aus seinem ersten Post nicht herauslesen. Dort sollte die Reihenfolge beim Eintragen nicht verändert werden. Ein "put" mit einem neuen Element unter einem bereits vorhandenen Schlüssel kann entweder als neues Element mit einer Aktualisierung der Reihenfolge sein, oder aber das Ersetzen eines bestehenden Elements unter Beibehaltung der Reihenfolge.
          Deshalb der Konjunktiv.

          Schöne Grüße,

          Peter

    2. Hi,

      vielen Dank für deine Hilfe. Das macht die Arbeit natürlich viel einfacher.

      Gruß