Groovy에서 맵을 반복 하시겠습니까?


175

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 () 반복하고 나머지는 예상대로 작동합니다.
Bill K

for 루프 내부의 코드에서 s.key& 를 사용하면 작동합니다 s.value.
inblueswithu

답변:


328

클로저로 매우 간단합니다.

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

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

2
호기심에서, 이것은 Groovy 언어 문서에서 어디에 문서화되어 있습니까 ( 그렇지 않다고 생각합니다! )? Groovy 초보자의 관점에서 궁금한 것 같습니다. 어떻게 알았습니까?
smeeb

10
@smeeb : 모든 것이 잘 정리되어
Jack

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 Philip

답변이 업데이트되었습니다. Netbeans를 사용하고 있으며 Groovy / Grails의 디버깅은 하위 수준입니다.
ubiquibacon

4
또한 for 루프가 아닌 in 루프를 나눌 수 있습니다 .each.
Alexander Suraphel

1
@AlexanderSuraphel 당신은 당신이 break종료 하는 데 사용할 수있는 것이 eachreturn
맞지만

7
@ubiquibacon 아니 당신은 할 수 없습니다. not return과 유사합니다 . continuebreak
Alexander Suraphel

20

for 루프를 사용할 때 s의 값은 Map.Entry 요소입니다. 이는 s.key에서 키와 s.value에서 값을 가져올 수 있음을 의미합니다.


5
설명 감사합니다 이유는 영업 이익의 코드가 작동하지 않습니다
dj18

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.