迭代HashMap的HashMap

时间:2014-07-13 02:21:02

标签: java hashmap

为什么这是错的?

for (Entry<String, HashMap> temp : wordCountforFile.entrySet()) {
        System.out.println(temp.getKey());
        for(Entry<String, Integer> temp1: temp.getValue()){
            //Wrong?
        }
    }

其中:     HashMap wordCountforFile = new HashMap();

HashMap<String, Integer> wordCount = new HashMap<String, Integer>();

wordCountforFile.put("Any String", wordCount);

2 个答案:

答案 0 :(得分:3)

这是错误的,因为您没有为HashMap temp指定泛型。此外,如果您期望entrySet(),则应迭代最里面循环中的Map.Entry。你应该使用:

for (Entry<String, HashMap<String, Integer>> temp : wordCountforFile.entrySet()) {
    System.out.println(temp.getKey());
    for(Entry<String, Integer> temp1 : temp.entrySet()){
        // ...
    }
}

作为旁注,我通常会发现,如果你有一张地图的地图,这意味着其中一张地图在逻辑上代表某种类型的实体,如果你将它移动到它自己的类,可以简化它。只是一个想法。

答案 1 :(得分:1)

    HashMap<String, HashMap<String, Integer>> wordCountforFile = new HashMap<String, HashMap<String, Integer>>();

    HashMap<String, Integer> wordCount = new HashMap<String, Integer>();

    wordCountforFile.put("Any String", wordCount);

    for (Map.Entry<String, HashMap<String, Integer>> temp : wordCountforFile.entrySet()) {
        System.out.println(temp.getKey());
        for(Map.Entry<String, Integer> temp1: temp.getValue().entrySet()){

        }
    }
 }

wordCountForFile未使用泛型定义。如果没有泛型,则应该进行显式类型转换。

   for(Map.Entry<String, HashMap<String, Integer>> temp : ((Set<Map.Entry<String, HashMap<String, Integer>>>) wordCountforFile.entrySet()))

但这并不总是安全的,因为如果条目不是String&amp;类型,它会导致ClassCastException。 HashMap中。如果已知地图中的键和值的类型可以避免ClassCastException,那么使用泛型总是更好。

temp.getValue()返回String&amp;的映射。整数。如果要迭代此映射中的每个条目,请使用temp.getValue()。entrySet()