14

私は次の地図を持っています:

def map = [];
map.add([ item: "Shampoo", count: 5 ])
map.add([ item: "Soap", count: 3 ])

countマップ内のすべてのプロパティの合計を取得したいと思います。LINQを使用するC#では、次のようになります。

map.Sum(x => x.count)

Groovyで同じことをするにはどうすればよいですか?

4

3 に答える 3

23

あなたがそのようなリストを持っていると仮定します:

List list = [ [item: "foo", count: 5],
              [item: "bar", count: 3] ]

次に、それを行うには複数の方法があります。最も読みやすいのはおそらく

int a = list.count.sum()

または、リスト全体で合計のクロージャー形式を使用することもできます

int b = list.sum { it.count }

または、注入などのより複雑なルートを使用することもできます

int c = list.count.inject { tot, ele -> tot + ele } // Groovy 2.0
//  c = list.count.inject( 0 ) { tot, ele -> tot + ele } // Groovy < 2.0

これらはすべて同じ結果になります。

assert ( a == b ) && ( b == c ) && ( c == 8 )

私は最初のものを使用します。

于 2012-08-14T07:54:44.867 に答える
1

演算子を使用しcollectます。groovyshで次のコードを確認しました。

list1 = []
total = 0
list1[0] = [item: "foo", count: 5]
list1[1] = [item: "bar", count: 3]
list1.collect{ total += it.count }
println "total = ${total}"
于 2012-08-14T05:44:34.750 に答える
1

まず第一に、あなたはあなたの例でマップとリストの構文を混乱させています。とにかく、Groovyはすべてのコレクションに.sum(closure)メソッドを挿入します。

例:

[[a:1,b:2], [a:5,b:4]].sum { it.a }
===> 6
于 2012-08-14T07:04:00.583 に答える