在Groovy中循环浏览地图?


174

我正在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(),其余的将按预期工作。
比尔K

如果在for循环中的代码中使用s.keys.value,它应该可以工作。
inblueswithu

Answers:


327

闭包非常简单:

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

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

2
出于好奇,这在Groovy语言文档中有何记载(我认为不是!)?我想我想知道从Groovy新手的角度来看,您怎么知道的?
smeeb 2015年

10
@smeeb:一切都有据可查,请在此处查看:groovy-lang.org/groovy-dev-kit.html#_iterating_on_maps
杰克

101

或者,您可以使用Groovy Docs中for所示的循环:

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
*/

使用for循环而不是each闭包的一个好处是调试起来更容易,因为您无法在each闭包内部碰到断点(使用Netbeans时)。


我使用GGTS 3.2,并在闭包(包括“每个”闭包)中常规设置断点。问题是使用F6逐步完成关闭,因为它将遍历整个过程。从技术上讲,您可以多次击中F5并最终进入该位置,但是断点更快。
菲利普(Philip)

更新的答案。我正在使用Netbeans,它对Groovy / Grails的调试是低于标准的。
ubiquibacon

4
另外,您可以中断for循环,而不能中断.each
Alexander Suraphel 2015年

1
@AlexanderSuraphel是正确的,您不能使用它break来退出each,但可以使用return
ubiquibacon 2015年

7
@ubiquibacon不,你不能。return类似于continuenot break
亚历山大·苏拉菲尔

20

使用for循环时,s的值是Map.Entry元素,这意味着您可以从s.key获取键,而从s.value获取值


5
感谢您解释原因在OP的代码不起作用
dj18

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.