Verschachtelte Map auslesen

Chebura

Mitglied
Hallo zusammen,
ich stehe vor einem seltsamen Problem.
Wenn ich Werte aus der äußeren Map auslese, so sind die Keys nicht in der Rheinfolge, in der ich sie einlesen habe.
Will ich dann Value aulesen (was eine Map darstellt), so hat es keine Werte.
All das passiert, obwohl beim Einlesen alles richtig abläuft.

Java:
public class meineKlasse {
   HashMap<String, HashMap> mapA;
   HashMap<String, String> mapB;

   //Einlesen attributeList hat schon Werte:
   for (Object obj: attributeList) {
     Attribute attr = (Attribute) obj;
     mapB.put(attr.getName(), attr.getValue());
   }
   this.mapA.put(name, this.mapB);
   this.mapB.clear();

   //Auslesen....falsche Rheinfolge in der äußeren Map, die innere Map ist leer:
   private void Funktion() {
     for (HashMap.Entry<String, HashMap> entrySet: mapA.entrySet()) {
       System.out.println("Äusere Map: " + entrySet.getKey());
       HashMap<String, String > value = entrySet.getValue(); //Hole die innere mapB
       for (HashMap.Entry<String, String> entry: value.entrySet()) {
         System.out.println("jeweiliger Schluessel von mapB: " + entry.getKey() + "jeweiliger Wert von mapB: " + entry.getValue());
       }
     }
   }
}

Wieso kann ich nicht das auslesen, was ich eingelesen hab?
Danke für die Aufklärung.
 
Zuletzt bearbeitet von einem Moderator:
Weil du deine mapB die ganze Zeit löscht. Du speicherst in MapA nur die Referenz auf die MapB und nicht das Objekt.

EDIT: Hier wie deine Klasse richtig aussehen sollte gesamt mit einer KSKB:
Java:
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class Test {
     public static void main(String... args) {
         MeineKlasse mk = new MeineKlasse();
         mk.put("Test1", Arrays.asList(new Attribute("1", "1")));
         mk.put("Test2", Arrays.asList(new Attribute("1", "1"), new Attribute("2", "2")));
         mk.put("Test3", Arrays.asList(new Attribute("1", "1"), new Attribute("2", "2"), new Attribute("3", "3")));
         mk.print();
     }
}

class MeineKlasse {
     Map<String, Map<String, String>> mapA = new LinkedHashMap<>();
     
     public void put(String name, List<Object> attributeList) {
         Map<String, String> mapB = new HashMap<>();
         for (Object obj : attributeList) {
             if (obj instanceof Attribute) {
                 Attribute attr = (Attribute) obj;
                 mapB.put(attr.getName(), attr.getValue());
             }
         }
         mapA.put(name, mapB);
     }
     
     public void print() {
         for (Entry<String, Map<String, String>> entrySet : mapA.entrySet()) {
             System.out.println("Äußere Map: " + entrySet.getKey());
             for (Entry<String, String> entry : entrySet.getValue().entrySet()) {
                 System.out.println("Schlüssel von mapB: " + entry.getKey() + " Wert von mapB: " + entry.getValue());
             }
         }
     }
}

class Attribute {
     private String name, value;
     
     public Attribute(String name, String value) {
         super();
         this.name = name;
         this.value = value;
     }
     
     public String getName() {
         return name;
     }
     
     public String getValue() {
         return value;
     }
}
 
Zuletzt bearbeitet:
danke für deine schnelle Antwort.
ich lösche sie deswegen, damit der nächste Key von der mapA nur die neuen Werte der mapB erhält und nicht neue+alte Werte.
Das mit der Referenz hab ich mir schon gedacht. Wie kann ich den das Object selbst als "Value" zu dem Key der MapA speichern?
 
Das Object selbst als Value zu übergeben Funktioniert meines Wissens nach in Java nicht(korrigiert mich wenn Oracle sich da was neues Überlegt hat). In Java wird Grundsätzlich mit Referenzen gearbeitet, außer bei den primitiven Datentypen.
 
Vielen Dank für die Antworten.
Die wesentliche Sache die ich übernommen habe, ist dass man die äußere als "LinkedHashMap" und den Value-Wert als Map ausschreiben muss sprich: map<String, map<String, String> = new LinkedHashmap.
Das selbe noch beim Entry in der For-Schleife.
Natürlich hätte ich da jedesmal speicher neu allokieren müssen und nicht die map mit "clear" entleeren
Vielen Dank
 

Zurück
Oben