Прокрутіть карту в Groovy?


175

У мене дуже просте завдання, яке я намагаюся зробити в 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 (), а решта працюватиме так, як ви очікували.
Білл К

Він повинен працювати, якщо ви використовуєте 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: все добре задокументовано, подивіться тут: groovy-lang.org/groovy-dev-kit.html#_iterating_on_maps
Джек

101

Крім того, ви можете використовувати 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
*/

Однією з переваг використання forциклу на відміну від eachзакриття є легше налагодження, оскільки ви не можете потрапити на точку розриву всередині eachзамикання (при використанні Netbeans).


Я використовую GGTS 3.2 і регулярно встановлюю точки перерви в закриттях (включаючи "кожне" закриття). Проблема полягає у використанні F6 для того, щоб перейти через закриття, оскільки воно буде переносити всю справу. Технічно ви можете ударити F5 купу разів і врешті-решт опинитесь там, але точка перерви швидша.
Філіп

Оновлена ​​відповідь. Я використовую Netbeans, і його налагодження Groovy / Grails є підпунктом.
ubiquibacon

4
Плюс ви можете вирвати цикл for, а не в .each.
Олександр Сурафель

1
@AlexanderSuraphel ви праві, що не можете використовувати breakдля виходу each, але можете скористатисяreturn
ubiquibacon

7
@ubiquibacon ні, ти не можеш. returnє аналогом continueне break.
Олександр Сурафель

20

Під час використання циклу for for значення s - це елемент Map.Entry, що означає, що ви можете отримати ключ від s.key та значення з s.value


5
Дякуємо, що пояснили, чому код ОП не працює
dj18

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.