2013-12-09 71 views
5

我想在Groovy中更新地圖中的值,以填充特定條件。這裏是我的代碼:使用findAll和groovy更新地圖

def m = [:] 
m['a'] = 1 
m['b'] = 2 
m['d'] = 3 
m.findAll { it.value > 1}.each { 
it.value = 4 
} 
println m 

但結果如下:

[a:1, b:2, d:3] 

有什麼辦法同時使用的findAll和各辦呢?或者我必須使用

m.each {if (it.value>1) it.value=4} 

回答

8

的根本原因是findAll返回新的地圖實例

所以,你可以嘗試:

newMap = m.findAll { it.value > 1}.each { 
    it.value = 4 
} 
println m  //No change 
println newMap //This is what you need! 

輸出

[a:1, b:2, d:3] 
[b:4, d:4] 
4

在每一種情況下,你與each迭代值的指針鍵和值映射條目。當您設置it.value時,您並未替換地圖中的內容。您只更新地圖項中的指針。實際設置的值,你需要做到以下幾點:

m.findAll { it.value > 1 }.each { m[it.key] = 4 } 
+0

是的,這是正確的太多,但有更大的複雜性:爲O(n^2) – kazik1616

+0

其實在這種情況下,只是O(2n)。 'findAll'將會執行n個步驟,最壞的情況下,'each'也會執行n個步驟。 –

+0

替換'it.value'的作品。我張貼我的答案。 –