2012-08-14 33 views
9

我有以下地圖:在Groovy中,如何爲地圖中的某個屬性添加值?

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

我想獲得的所有在地圖中count特性的總和。在使用LINQ C#中,這將是這樣的:

map.Sum(x => x.count) 

我如何做同樣的在Groovy?

+2

請檢查您的代碼 - 它看起來不對我。例如。通常用於列表而不是地圖的「添加」方法。第三行缺少「count:」鍵? – nickdos 2012-08-14 05:37:23

+1

此代碼無效。在groovy控制檯中檢查它。 – 2012-08-14 07:29:32

+0

哎呀,這是當你出門時輸入問題時發生的事情:)。 – 2012-08-14 10:18:18

回答

18

假設你有一個列表,像這樣:

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) 

我會用第一個。

+0

謝謝,這比我想象的要容易。 – 2012-08-14 19:18:40

0

您想使用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}" 
+1

這項工作,但不是最意識形態的Groovy – 2012-08-14 07:55:59

1

首先,您在示例中混淆了map和list語法。無論如何,Groovy爲所有集合注入了一個.sum(closure)方法。

例子:

[[a:1,b:2], [a:5,b:4]].sum { it.a } 
===> 6 
相關問題