我有以下地圖:在Groovy中,如何爲地圖中的某個屬性添加值?
def map = [];
map.add([ item: "Shampoo", count: 5 ])
map.add([ item: "Soap", count: 3 ])
我想獲得的所有在地圖中count
特性的總和。在使用LINQ C#中,這將是這樣的:
map.Sum(x => x.count)
我如何做同樣的在Groovy?
我有以下地圖:在Groovy中,如何爲地圖中的某個屬性添加值?
def map = [];
map.add([ item: "Shampoo", count: 5 ])
map.add([ item: "Soap", count: 3 ])
我想獲得的所有在地圖中count
特性的總和。在使用LINQ C#中,這將是這樣的:
map.Sum(x => x.count)
我如何做同樣的在Groovy?
假設你有一個列表,像這樣:
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-14 19:18:40
您想使用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}"
這項工作,但不是最意識形態的Groovy – 2012-08-14 07:55:59
首先,您在示例中混淆了map和list語法。無論如何,Groovy爲所有集合注入了一個.sum(closure)方法。
例子:
[[a:1,b:2], [a:5,b:4]].sum { it.a }
===> 6
請檢查您的代碼 - 它看起來不對我。例如。通常用於列表而不是地圖的「添加」方法。第三行缺少「count:」鍵? – nickdos 2012-08-14 05:37:23
此代碼無效。在groovy控制檯中檢查它。 – 2012-08-14 07:29:32
哎呀,這是當你出門時輸入問題時發生的事情:)。 – 2012-08-14 10:18:18