2010-07-01 82 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(); 
     } 
    }; 
} 

注意可讀性應優於過早的優化,但有這一點是很重要的。