2016-03-26 2 views
1

Я новичок в Java, так что извините, если это довольно очевидно, но я не могу понять, как работать с двумя HashMaps внутри друг друга У меня есть моя основная, где я хочу добавить несколько слов на карту, а затем, я хочу, чтобы прочитать их:Как читать карту внутри другой карты, на 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); 
} 

Эта карта имеет другую карту внутри него:

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

затем я добавляю эти слова:

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

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

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

} 

И переопределить функцию ToString, чтобы читать их, но появляется только 1 значение на ключ:

@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; 
} 

Почему это? Я смотрю на это, как если бы это был двумерный массив, но с двумя значениями (ключ, значение) в каждой позиции.

Как сделать, чтобы показать все значения, которые имеют ключи от первой карты?

Спасибо, извините за такой базовый вопрос.

ответ

2

Вам нужно изменить свой метод добавления к следующему

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

Я действительно думал, что 'dic.put (s1, m)' укажет начало другой карты на ключ s1 , без необходимости использовать 'dic.get (s1)'. Спасибо :) – notihs

+1

В вашем исходном коде вы делали Map m = new HashMap <>(); , который сбросил hashmap. Его любопытно сложно представить карту внутри хэш-карты. Хороший вопрос. :-) –

1

Проблема заключается в том, что в методе add(String, String, String), вы Instancing новый HashMap каждый раз, так что вы перезаписать ранее инстанс HashMap от предыдущего вызова.

Вы должны обновить ваш метод следующим образом:

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); 
} 

Чтобы избежать того, чтобы управлять этим вручную самостоятельно, я предлагаю вам использовать Guava's Table структуру данных (более конкретно HashBasedTable).

+0

бы не 'dic.get (s1)' бросить NullPointerException? –

+0

Из документов: V get (Object key) Возвращает значение, для которого указан указанный ключ, или null, если эта карта не содержит сопоставления для ключа. (Https://docs.oracle.com/javase/7/ docs/api/java/util/Map.html # get (java.lang.Object)) – dabadaba

+0

Однако это решение также отменяет предыдущее сохраненное значение, не так ли? OP добавляет повторяющиеся ключи. Вероятно, он хочет «Карта» > ', где у вас есть' {word_key, [{language1, word_in_language1}, {language2, word_in_language2}] ' – dabadaba

Смежные вопросы