Groovyでマップをループしますか?


175

Groovyで実行しようとしている非常に単純なタスクがありますが、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.key&を使用すると機能s.valueします。
inblueswithu 2017年

回答:


328

クロージャーでかなりシンプル:

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
Jack

101

あるいはforGroovy 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なくループを使用する利点の1つeachは、eachクロージャー内のブレークポイントに到達できないためです(Netbeansを使用する場合)。


私はGGTS 3.2を使用し、クロージャー(「各」クロージャーを含む)にブレークポイントを定期的に設定しています。問題は、F6を使用してクロージャーをステップスルーすることです。技術的には、F5を何度も押して、最終的にそこに到達することができますが、ブレークポイントの方が高速です。
フィリップ

回答を更新しました。私はNetbeansを使用していますが、Groovy / Grailsのデバッグは準標準です。
ubiquibacon 2013年

4
さらに、forではなくforループを作成でき.eachます。
Alexander Suraphel、2015

1
@AlexanderSuraphel正しいのでbreak、終了eachには使用できませんが、使用できますreturn
ubiquibacon

7
@ubiquibaconいいえ、できません。returncontinuenotに類似していbreakます。
Alexander Suraphel、2015

20

forループを使用する場合、sの値はMap.Entry要素です。つまり、s.keyからキーを取得し、s.valueから値を取得できます。


5
OPのコードが機能しない理由を説明していただきありがとうございます
dj18

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.