2013-12-20 53 views
1

我正在爲一點代碼苦苦掙扎,我只是無法弄清楚正確的語法是什麼。這是問題的一個例子:從密鑰中迭代LinkedHashMap的值

for (Integer key : map1.keySet()) { 

    for (Integer value : map2.values()) { 

     if (value == key) { 

      // ++ the corresponding value of the looping map1 key. 
      // tried statements like map1.values()++ 
      // but this is an invalid operation. 

     } 
    } 
} 

我試圖遍歷map2值,如果這個過程map1map2值匹配內map1鍵,我想添加一個到相應map1的價值鍵。

應該是一個簡單的問題,但Eclipse一直告訴我,我有語法錯誤,任何人都可以提出我可能需要迭代值的聲明?

+1

請加入Eclipse的語法錯誤 –

+0

堆棧跟蹤將是巨大的。 – csmckelvey

回答

2

這裏是你如何可以用非常小的修改做您的代碼:

for (Map.Entry<Integer,Integer> entry : map1.entrySet()) { 
    for (Integer value : map2.values()) { 
     if (value.equals(entry.getKey())) { 
      entry.setValue(entry.getValue()+1); 
     } 
    } 
} 

編輯:由於map2可能包含相同不止一次,使用散列設置爲加快速度將不會按預期工作的其他解決方案。

+0

對於HashSet +1,我在想同樣的事情:) –

+0

感謝您的幫助!通過這個設置,我只得到了map1的值1。每次map1鍵等於map2值時,我都需要加1。我需要在其他地方移動「+1」嗎? – user2941526

+0

@ user2941526我看到 - 'map2'可以有多次相同的值,對吧?那麼你應該使用兩個循環的版本。 – dasblinkenlight

0

我不知道爲什麼Eclipse的報告語法錯誤,但在任何情況下,這種循環就沒有太大的意義,可以考慮將其更改爲:

for (Integer value : map2.values()) 
    if (map1.containsKey(value)) 
     // bla bla 

將在O(n)的運行,而不是前者O(N * M)

當n爲MAP2和M的大小是MAP1(由@dasblinkenlight通知)的大小

+0

我相信一張地圖應該可以找到和平均的O(1) –

+0

@dasblinkenlight請參閱http://stackoverflow.com/questions/1055243/is-a-java-hashmap-really-o1 –

+0

是的,你可以看到我在那裏尋找鑰匙,這就是爲什麼我切換塊的順序 –

0

你如何初始化你的地圖?像Map<Integer, Integer> map1=new LinkedHashMap<Integer, Integer>();Map map1=new LinkedHashMap();如果第二種方式的鍵將是Object not Integer。並且在所有情況下使用==不良做法比較兩個整數。使用等於

0

您可以使用containsKey方法是這樣的:

for (Integer value : map2.values()){ 
if (map1.containsKey(value)) 
    map1.put(key, value); 

... 
}