2010-07-01 80 views

回答

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); 
} 
+8

将此与Python版本进行比较可以提醒我为什么在几年前放弃了Java。 – 2010-07-01 18:47:33

3
Set<Map.Entry> set = d.entrySet(); 
for(Map.Entry i : set){ 
    System.out.println(i.getKey().toString() + i.getValue().toString); 
} 

类似的东西...

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)); 
    } 
+0

为什么downvote? – bragboy 2010-07-01 12:19:13

+0

我没有做downvote,但这种方法比迭代entryset效率低。 get()在每次迭代中都有额外的成本。至少不是通过地图循环的“正确”方式。我可以想象一个因此而低估的人,你的意图也有多好。 – BalusC 2010-07-01 12:29:28

+2

@BalusC - 是的,但创建MapEntrySet迭代器(最有可能)比创建集迭代器更昂贵......我怀疑,这是一个性能问题,即使这不是性能高,我也从来没有**尝试通过*优化*来解决性能问题。 (从我+1,顺便说一句)。 – 2010-07-01 12:50:36

6

正如答案所示,基本上都是以迭代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()'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(); 
     } 
    }; 
} 

注意可读性应优于过早的优化,但有这一点是很重要的。