2012-08-14 79 views
9

Tengo el siguiente mapa:En Groovy, ¿cómo puedo sumar los valores de una determinada propiedad en un mapa?

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

me gustaría obtener la suma de todos los count propiedades en el mapa. En C# usando LINQ, sería algo así como:

map.Sum(x => x.count) 

¿Cómo hacer lo mismo en Groovy?

+2

Por favor, compruebe su código: me parece incorrecto. P.ej. El método "agregar" generalmente se usa en listas, no en mapas. La tercera línea no tiene la tecla "contar:". – nickdos

+1

Este código no es válido. Compruébalo en la consola groovy. –

+0

Vaya, esto es lo que sucede cuando escribes una pregunta cuando te diriges a la puerta :). –

Respuesta

18

Asumiendo que tiene una lista de este modo:

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

Luego hay varias formas de hacerlo. La más legible es probablemente

int a = list.count.sum() 

o puede utilizar el formulario de cierre de la suma de toda la lista

int b = list.sum { it.count } 

O incluso se puede utilizar una ruta más compleja como inyectar

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

Todos estos dan el mismo resultado.

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

Utilizaría el primero.

+0

Gracias, eso fue más fácil de lo que pensaba. –

0

Desea utilizar el operador collect. Comprobé el siguiente código 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

Esto funciona, pero no es el más ideomatic Groovy –

1

En primer lugar, está confundiendo la sintaxis del mapa y la lista en su ejemplo. De todos modos, Groovy inyecta un método .sum(closure) a todas las colecciones.

Ejemplo:

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