【发布时间】:2011-03-10 14:39:14
【问题描述】:
在 Python 中,您可以在字典中包含键、值对,您可以在其中循环访问它们,如下所示:
for k,v in d.iteritems():
print k,v
有没有办法用 Java HashMaps 做到这一点?
【问题讨论】:
标签: java python hashmap equivalent
在 Python 中,您可以在字典中包含键、值对,您可以在其中循环访问它们,如下所示:
for k,v in d.iteritems():
print k,v
有没有办法用 Java HashMaps 做到这一点?
【问题讨论】:
标签: java python hashmap equivalent
是的 - 例如:
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() 的键值对的bean。然后你可以循环它们。
我认为是最接近 Python 版本的东西。
【讨论】:
如答案所示,基本上有两种方法可以迭代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() 相同的same 迭代器。唯一的区别是在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();
}
};
}
请注意,与过早优化相比,应优先考虑可读性,但记住这一点很重要。
【讨论】:
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));
}
【讨论】:
get() 每次迭代都会产生额外费用。这至少不是循环遍历地图的“正确”方式。我可以想象有人因此而被否决,你的意图也有多好。
private Iterator<Entry<K,V>> i = entrySet().iterator(); public K next() { return i.next().getKey(); }