2011-02-25 11 views
5

necesito para llenar un mapa de modo que:lista como valor del mapa en griales

  • La clave es una cadena
  • El valor es una lista de cadenas

El proceso es ir a través de todos los registros en una tabla que tiene dos campos de texto: "parámetro" y "valor". "Parámetro" no es único y tiene muchos duplicados. Entonces, lo que intento hacer es:

def all = MyTable.findAll() 
def mymap = [:] 

all.each { 
    // add to mymap the element "it.value" to the list that has "it.parameter" as key 
} 

¿Alguna pista?

Gracias

Respuesta

9

No hacer esto mediante el uso de 'withDefault' introducido en Groovy 1.7 un poco en mi humilde opinión más simple manera:

all = [ 
    [parameter: 'foo', value: 'aaa'], 
    [parameter: 'foo', value: 'bbb'], 
    [parameter: 'bar', value: 'ccc'], 
    [parameter: 'baz', value: 'ddd'] 
] 

def myMap = [:].withDefault { [] } 
all.each { 
    myMap[it.parameter] << it.value 
} 

assert myMap.size() == 3 
assert myMap.foo == ['aaa','bbb'] 
assert myMap.bar == ['ccc'] 
assert myMap.baz == ['ddd'] 
+1

Como un aparte, con Groovy 1.8+ puedes hacer lo siguiente 'all.groupBy {it.parameter} .collectEntries {k, v -> [(k): v * .value]} 'que es potencialmente más simple otra vez :-) –

+0

Además, antes de Groovy 1.8 puedes hacer:' all.groupBy {it.parameter} .inject ([:]) { map, val -> map << [(val.key): val.value * .value]} ' –

+0

pero supongo que lo anterior es más legible. –

6

Puede utilizar el método Map.groupBy, que se dividirá la colección en un mapa de grupos basados ​​en el pasado en el cierre. Aquí está un ejemplo completo, que también llamadas a cobro revertido para que cada punto parámetro a sólo los valores:

all = [ 
    [parameter: 'foo', value: 'aaa'], 
    [parameter: 'foo', value: 'bbb'], 
    [parameter: 'bar', value: 'ccc'], 
    [parameter: 'baz', value: 'ddd'] 
] 
tmpMap = all.groupBy{it.parameter} 
myMap = [:].putAll(tmpMap.collect{k, v -> [k, v.value] as MapEntry}) 

assert myMap == [foo: ['aaa', 'bbb'], bar: ['ccc'], baz:['ddd']] 
+4

+1 mucho mejor que mi respuesta. Codigo groovy como java ... consigue el trabajo, pero no genial ... – hvgotcodes

Cuestiones relacionadas