在Python中,你可以有键,值对的字典,你可以遍历它们,如下图所示:像Python字典一样循环Java HashMap?
for k,v in d.iteritems():
print k,v
有没有办法与Java HashMaps这样做呢?
在Python中,你可以有键,值对的字典,你可以遍历它们,如下图所示:像Python字典一样循环Java HashMap?
for k,v in d.iteritems():
print k,v
有没有办法与Java HashMaps这样做呢?
是 - 例如:
Map<String, String> map = new HashMap<String, String>();
// add entries to the map here
for (Map.Entry<String, String> entry : map.entrySet()) {
String k = entry.getKey();
String v = entry.getValue();
System.out.printf("%s %s\n", k, v);
}
的HashMap.entrySet()将返回类似dictionary.iteritems()键值对豆类。然后你可以循环它们。
我认为是最接近Python版本的东西。
Set<Map.Entry> set = d.entrySet();
for(Map.Entry i : set){
System.out.println(i.getKey().toString() + i.getValue().toString);
}
类似的东西...
在Java中,你可以做同样像下面这样。
HashMap<String, String> h = new HashMap<String, String>();
h.put("1","one");
h.put("2","two");
h.put("3","three");
for(String key:h.keySet()){
System.out.println("Key: "+ key + " Value: " + h.get(key));
}
为什么downvote? – bragboy 2010-07-01 12:19:13
我没有做downvote,但这种方法比迭代entryset效率低。 get()在每次迭代中都有额外的成本。至少不是通过地图循环的“正确”方式。我可以想象一个因此而低估的人,你的意图也有多好。 – BalusC 2010-07-01 12:29:28
@BalusC - 是的,但创建MapEntrySet迭代器(最有可能)比创建集迭代器更昂贵......我怀疑,这是一个性能问题,即使这不是性能高,我也从来没有**尝试通过*优化*来解决性能问题。 (从我+1,顺便说一句)。 – 2010-07-01 12:50:36
正如答案所示,基本上都是以迭代Map
两种方式(让我们假设在这些例子Map<String, String>
)。
for (Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
遍历Map#keySet()
然后用Map#get()
获得的价值为每一个关键:
for (String key : map.keySet()) {
System.out.println(key + "=" + map.get(key));
}
第二个是可能更多可读,但它具有不必要地调用的性能成本每一次迭代都会有get()
。有人可能会说,创建密钥集迭代器的成本较低,因为它不需要考虑值。但是不管相信,keySet().iterator()
创建并使用相同的迭代器作为entrySet().iterator()
。唯一的区别是,在keySet()
的情况下,迭代器的next()
调用返回it.next().getKey()
而不是it.next()
。
的AbstractMap#keySet()
's javadoc证明这一点:
子类的迭代方法返回一个“包装对象”过此映射的
entrySet()
迭代器。
AbstractMap
源代码也证明了这一点。下面是keySet()
方法(大约在Java 1.6的线300某处)的提取液:
public Iterator<K> iterator() {
return new Iterator<K>() {
private Iterator<Entry<K,V>> i = entrySet().iterator(); // <-----
public boolean hasNext() {
return i.hasNext();
}
public K next() {
return i.next().getKey(); // <-----
}
public void remove() {
i.remove();
}
};
}
注意可读性应优于过早的优化,但有这一点是很重要的。
将此与Python版本进行比较可以提醒我为什么在几年前放弃了Java。 – 2010-07-01 18:47:33