2016-03-26 10 views
1

Ich bin neu in Java, tut mir leid, wenn das ziemlich offensichtlich ist, aber ich kann nicht ganz verstehen, wie man mit 2 HashMaps ineinander arbeitet Ich habe meine Haupt, wo ich ein paar Worte zu einer Karte hinzufügen möchte, und dann will ich sie lesen:Wie lese ich eine Map in einer anderen Map in Java?

public static void main(String[] args) { 
    Dicionario d = new Dicionario(); 
    d.add("english", "BOOK", "Book"); 
    d.add("french", "BOOK", "livre"); 
    d.add("portuguese", "BOOK", "livro"); 
    d.add("english", "YEAR", "year"); 
    d.add("french", "YEAR", "an"); 
    d.add("portuguese", "YEAR", "ano"); 
    System.out.println(d); 
} 

Diese Karte, eine andere Karte in ihm hat:

private Map<String, Map<String, String> > dic = new HashMap<>(); 

dann füge ich diese Worte:

protected void add(String s1, String s2, String s3){ 

    Map<String, String> m = new HashMap<>(); 

    m.put(s2, s3); 
    dic.put(s1, m); 

} 

Und die Funktion toString neu definieren sie, zu lesen, sondern erscheint nur 1 Wert pro Schlüssel:

@Override 
public String toString(){ 
    String s= ""; 

    for(Map.Entry<String, Map<String,String>> entry : dic.entrySet()) 
    { 
     s += "\"" + entry.getKey() + "\": "; 



     for(Map.Entry<String, String> entry2 : dic.get(entry.getKey()).entrySet()) 
     { 
      s+=entry2.getKey() + "->" + entry2.getValue() + "\t"; 

     } 
     s+="\n"; 
    } 

    return s; 
} 

Warum ist das so? Ich sehe das wie wenn es ein zweidimensionales Array wäre, aber mit 2 Werten (Schlüssel, Wert) in jeder Position.

Wie kann ich alle Werte anzeigen, die die Schlüssel aus der ersten Karte haben?

Danke und Entschuldigung für solch eine grundlegende Frage.

Antwort

2

Sie benötigen eine Add-Methode auf folgende

protected void add(String s1, String s2, String s3) { 
    Map<String, String> m = null; 
    m = dic.get(s1); 
    if (m == null) { 
     m = new HashMap<>(); 
    } 
    m.put(s2, s3); 
    dic.put(s1, m); 
} 
+1

Ich dachte wirklich, dass 'dic.put (s1, m)' würde den Anfang der anderen Karte auf den Schlüssel s1 zeigen , ohne 'dic.get (s1)' zu verwenden. Danke :) – notihs

+1

In Ihrem ursprünglichen Code, machst du Map m = neue HashMap <>(); die die hashmap zurückgesetzt hat. Es ist ein bisschen schwierig, sich eine Karte in einem hashmap vorzustellen. Gute Frage. :-) –

1

Das Problem ist, dass in Ihrer add(String, String, String) Methode, Sie sind ein neues HashMap jedes Mal Instancing, so dass Sie die vorher instanzierten HashMap von einem frühen Aufruf überschreiben.

Sie sollten Ihre Methode, um diese Art und Weise zu aktualisieren:

protected void add(String s1, String s2, String s3){ 
    Map<String, String> m = dic.get(s1); 

    if (m == null) { 
     m = new HashMap<>(); 
     dic.put(s1, m); 
    } 

    m.put(s2, s3); 
} 

Um zu vermeiden, dies selbst von Hand zu verwalten, schlage ich vor, dass Sie Guava's Table Datenstruktur (insbesondere HashBasedTable) verwenden.

+0

Würde nicht 'dic.get (s1)' werfen einen Nullpointer ändern? –

+0

Aus der Dokumentation: V get (Objektschlüssel) Gibt den Wert zurück, dem der angegebene Schlüssel zugeordnet wurde, oder null, wenn diese Zuordnung keine Zuordnung für den Schlüssel enthält. (Https://docs.oracle.com/javase/7/ docs/api/java/util/Map.html # erhalten (java.lang.Object)) – dabadaba

+0

Diese Lösung überschreibt jedoch auch den vorherigen gespeicherten Wert, nicht wahr? OP fügt wiederholte Schlüssel hinzu. Was er wahrscheinlich will, ist eine 'Map >', wo Sie '{word_key, [{language1, word_in_language1}, {language2, word_in_language2}]' – dabadaba

Verwandte Themen