2012-04-05 7 views
130

私は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 

誰かがこれを行う方法について詳しく説明してもらえます?

+0

あなたは答えを見てきたように、問題はマップを反復処理すると、あなたに「エントリ」のコレクションを与え、あなたはそれがあなたの鍵を与えるだろうし、あなたが希望と仮定したことがあります値を参照してください。このようにしたい場合は、map.keySet()を繰り返し実行すれば、残りは期待どおりに動作します。 –

+0

forループ内のコードで 's.key'と' s.value'を使用するとうまくいくはずです。 – inblueswithu

答えて

249

閉鎖とかなりシンプル:

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

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

好奇心から、これはどこに文書化されているのですか?(**私はそうは思わない!**)?あなたはこれをどうやって知ったのですか?* – smeeb

+5

@smeb:すべてがよく書かれています。こちらをご覧ください:http://www.groovy-lang.org/groovy- dev-kit.html#_iterating_on_maps – Jack

13

forループを使用する場合は、sの値は、あなたがs.keyからキーとsから値を得ることができることを意味し、のMap.Entry要素でありますGroovy Docsに示すように.VALUE

+0

説明してくれてありがとうございます*なぜOPのコードがうまくいきません – dj18

74

別の方法としては、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ループを使用する利点の1つをeachクロージャではなく、eachクロージャ(Netbeansを使用している場合)の中でブレークポイントに達することができないので、デバッグが簡単です。

+0

私はGGTS 3.2を使って、クロージャー( "各"クロージャーを含む)にブレークポイントを定期的に設定します。問題は、F6を使ってクロージャを踏むことです。技術的には、F5を数回押して、最終的にそこで終わることができますが、ブレークポイントは速くなります。 – Philip

+0

更新された回答。私はNetbeansを使用しており、Groovy/Grailsのデバッグはサブパネルです。 – ubiquibacon

+1

さらに、 '.each'ではなく、forループを壊すことができます。 –

10

別のオプション:

def map = ['a':1, 'b':2, 'c':3] 
map.each{ 
    println it.key +" "+ it.value 
}