我是Java的新手,很抱歉,如果这很明显,但我不太清楚如何在彼此内部使用2个HashMaps 我有我的主要内容,我想在地图中添加一些单词,然后,我想阅读它们:
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个值(键,值)。
如何显示第一张地图中的键的所有值?
谢谢,对不起这个基本问题。
答案 0 :(得分: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 :(得分:1)
问题在于,在add(String, String, String)
方法中,您每次都会实例化一个新的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
)。