在 Groovy 中循环遍历地图?

Posted

技术标签:

【中文标题】在 Groovy 中循环遍历地图?【英文标题】:Loop through Map in Groovy? 【发布时间】:2012-04-19 17:03:35 【问题描述】:

我正在尝试在 Groovy 中执行一项非常简单的任务,但似乎无法使其正常工作。我只是想在 groovy 中循环遍历一个地图对象并打印出键和值,但是这段代码不起作用。

// A simple map
def map = [
        iPhone : 'iWebOS',
        android: '2.3.3',
        Nokia  : 'Symbian',
        Windows: 'WM8'
]

// Print the values
for (s in map) 
    println s + ": " + map[s]

我试图让输出看起来像这样:

iPhone: iWebOS
Android: 2.3.3
Nokia: Symbian
Windows: WM8

有人可以详细说明如何做到这一点吗?

【问题讨论】:

正如您在答案中看到的那样,问题是遍历地图会为您提供“条目”的集合,您假设它会为您提供键并且您会查找值。如果您想这样做,请遍历 map.keySet() 其余部分将按您的预期工作。 如果您在 for 循环中的代码中使用 s.keys.value,它应该可以工作。 【参考方案1】:

非常简单的闭包:

def map = [
           'iPhone':'iWebOS',
           'Android':'2.3.3',
           'Nokia':'Symbian',
           'Windows':'WM8'
           ]

map.each k, v -> println "$k:$v" 

【讨论】:

出于好奇,这在 Groovy 语言文档中的什么地方记录(我不认为它是!)?我想我想知道,从 Groovy 新手的角度来看,你是怎么知道的? @smeeb:一切都有据可查,请看这里:groovy-lang.org/groovy-dev-kit.html#_iterating_on_maps【参考方案2】:

您也可以使用for 循环,如Groovy Docs 所示:

def map = ['a':1, 'b':2, 'c':3]
for ( e in map ) 
    print "key = $e.key, value = $e.value"


/*
Result:
key = a, value = 1
key = b, value = 2
key = c, value = 3
*/

each 闭包相比,使用for 循环的一个好处是更容易调试,因为您不能在each 闭包内遇到断点(使用Netbeans 时)。

【讨论】:

我使用 GGTS 3.2 并经常在闭包中设置断点(包括“每个”闭包)。问题是使用 F6 来逐步完成闭包,因为它会遍历整个过程。从技术上讲,您可以多次按 F5 并最终到达那里,但断点更快。 更新了答案。我正在使用 Netbeans,它对 Groovy/Grails 的调试低于标准。 另外你可以打破一个for循环而不是.each @AlexanderSuraphel 你是对的,你不能使用break 退出each,但你可以使用return @ubiquibacon 不,你不能。 return 类似于 continue 而不是 break【参考方案3】:

使用for循环时,s的值是一个Map.Entry元素,意思是可以从s.key中获取key,从s.value中获取值

【讨论】:

感谢您解释为什么 OP 的代码不起作用【参考方案4】:

另一种选择:

def map = ['a':1, 'b':2, 'c':3]
map.each
  println it.key +" "+ it.value

【讨论】:

以上是关于在 Groovy 中循环遍历地图?的主要内容,如果未能解决你的问题,请参考以下文章

Groovy集合遍历 ( 使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合 | 代码示例 )

Groovy - 如何退出每个循环?

如何遍历地图,修改地图但在每次迭代时恢复?

使用 JSTL 循环遍历地图 [重复]

有啥方法可以比 for 循环更快地遍历数组吗?

C++:遍历地图