Groovy在迭代地图时修改地图元素

Bob*_*Bob 2 groovy list map

我需要在迭代地图时修改地图元素,在我的情况下减去一些元素(列表).像这样:

def a = [
   1: [1, 2, 3],
   2: [3, 2, 4],
   3: [3, 2, 4],
   4: [5, 2, 1],
]
def b = [3]
println a
a.values().each{ tr ->
   tr = tr - b
}
println a
Run Code Online (Sandbox Code Playgroud)

a地图没有改变.结果是:

[1:[1, 2, 3], 2:[3, 2, 4], 3:[5, 3, 1], 4:[5, 2, 1]]
[1:[1, 2, 3], 2:[3, 2, 4], 3:[5, 3, 1], 4:[5, 2, 1]]
Run Code Online (Sandbox Code Playgroud)

但是,我想要结果[1:[1, 2], 2:[2, 4], 3:[5, 1], 4:[5, 2, 1]].我做错了什么?由于初始地图​​相当大,我不想构建具有较少元素的另一个地图(结果地图).

cfr*_*ick 7

直接在地图上工作:

a.keySet().each{
    a[it]-=b
}
Run Code Online (Sandbox Code Playgroud)

在您的代码中,您将结果分配给局部变量.

如果您对可能会考虑使用removeAll()或通过迭代bremove()每个更改的数量感到担忧.那些改变了列表.

  • 对于那些寻找:`Groovy:在迭代地图时修改元素`(首先在谷歌中显示),它适用于:`a.each { it.val = <new value> }`,如已接受的答案所示:http ://stackoverflow.com/questions/20481006/update-map-using-findall-and-each-in-groovy,或使用 `a.collect { it.getNewValue() }` 解释如下:http://mrhaki .blogspot.jp/2010/01/groovy-goodness-apply-method-to-all.html (2认同)