7

在 Python 中,您可以在字典中拥有键值对,您可以在其中循环访问它们,如下所示:

for k,v in d.iteritems():
    print k,v

有没有办法用 Java HashMaps 做到这一点?

4

5 回答 5

20

是的 - 例如:

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);
}
于 2010-07-01T12:11:31.847 回答
6

如答案所示,基本上有两种方法可以迭代 a (让我们在这些示例中Map假设)。Map<String, String>

  1. 迭代Map#entrySet()

    for (Entry<String, String> entry : map.entrySet()) {
        System.out.println(entry.getKey() + "=" + entry.getValue());
    }
    
  2. 迭代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()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();
        }
    };
}

请注意,可读性应该优于过早的优化,但记住这一点很重要。

于 2010-07-01T14:01:18.933 回答
6

HashMap.entrySet()将返回类似于dictionary.iteritems()的键值对的beans 。然后,您可以遍历它们。

我认为是最接近 Python 版本的东西。

于 2010-07-01T12:11:46.627 回答
3
Set<Map.Entry> set = d.entrySet();
for(Map.Entry i : set){
  System.out.println(i.getKey().toString() + i.getValue().toString);
}

那样的东西...

于 2010-07-01T12:13:48.623 回答
1

在 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));
    }
于 2010-07-01T12:14:16.027 回答