在 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.key
和 s.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 中循环遍历地图?的主要内容,如果未能解决你的问题,请参考以下文章