为什么我们使用entrySet()方法并使用返回的集来迭代映射?

时间:2011-03-25 05:33:35

标签: java dictionary collections iterator

通常我们写这个来获取地图中的键和值。

Map m=new HashMap();
Set s=map.entrySet();
Iterator i=s.iterator()
while(s.hasNext()){
    Map.Entry m= (map.Entry) s.next();
    System.out.println(""+m.getKey()+""+ m.getValue());
}

为什么我们使用集合迭代为什么不直接映射?

4 个答案:

答案 0 :(得分:26)

这就像我们可以在地图上迭代一样接近,因为你必须说明你是否只需要键,只需要值或整个键/值条目。对于集合和列表,只有一个选项,因此不需要单独的方法来执行此操作。

BTW:这是我迭代Map的方式。请注意泛型,for-each循环和LinkedHashMap的使用,以便条目以某种逻辑顺序出现。 TreeMap将是另一个不错的选择。

Map<K,V> m=new LinkedHashMap<K,V>();
for(Map.Entry<K,V> entry: m.entrySet())
    System.out.println(entry.getKey() + ": " + entry.getValue());

在Java 8中,您可以编写

m.forEach((k, v) -> System.out.println(k + ": " + v));

答案 1 :(得分:5)

因为从逻辑上讲,地图是键值对的Set 集合 - 这是Map.Entry所代表的。迭代通常是对集合的操作,而不是具体的映射。

但是,我经常想知道为什么Map没有实现Iterable<Map.Entry<K,V>>等并直接在地图条目上提供iterator()方法而不需要输入集(它当然也可以提供完整的Set API。

答案 2 :(得分:3)

地图是成对事物的集合,对(条目)。因此,您可以迭代条目,或仅迭代键(map.keySet()),或仅遍历值(map.values())。您还希望能够迭代什么?

答案 3 :(得分:2)

因为Java没有更好的语法来执行它。 (你的可以改进)

很高兴

for(String key, Integer val : map)
    print(key, val);

map.foreach (String key, Integer val) -> print(key, val);

但Java没有这些。