2012-08-14 7 views
9

Ho la seguente mappa:In Groovy, come faccio ad aggiungere i valori per una certa proprietà in una mappa?

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

Vorrei ottenere la somma di tutte le proprietà count nella mappa. In C# utilizzando LINQ, sarebbe qualcosa di simile:

map.Sum(x => x.count) 

Come faccio a fare lo stesso in Groovy?

+2

Si prega di controllare il codice - mi sembra sbagliato. Per esempio. Il metodo "aggiungi" di solito viene utilizzato sugli elenchi e non sulle mappe. 3ª riga manca la chiave "count:"? – nickdos

+1

Questo codice non è valido. Controllalo nella console Groovy. –

+0

Whoops, questo è quello che succede quando scrivi una domanda mentre stai uscendo dalla porta :). –

risposta

18

Supponendo di avere una lista in questo modo:

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

Poi ci sono diversi modi per farlo. Il più leggibile è probabilmente

int a = list.count.sum() 

Oppure si può utilizzare il modulo Chiusura della somma su tutta la lista

int b = list.sum { it.count } 

Oppure si potrebbe anche utilizzare un percorso più complesso come iniettare

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

Tutti questi danno lo stesso risultato.

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

Vorrei usare il primo.

+0

Grazie, è stato più facile di quanto pensassi. –

0

Si desidera utilizzare l'operatore collect. Ho controllato il seguente codice con 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

Questo funziona, ma non è il più ideomatic Groovy –

1

Prima di tutto, la sintassi della mappa e dell'elenco sono confuse nell'esempio. In ogni caso, Groovy inietta un metodo .sum(closure) a tutte le raccolte.

Esempio:

[[a:1,b:2], [a:5,b:4]].sum { it.a } 
===> 6 
Problemi correlati