2011-02-25 3 views
5

Je dois remplir une carte afin que:Liste en tant que valeur de carte dans Grails

  • La clé est une chaîne
  • La valeur est une liste de chaînes

Le processus est d'aller à travers tous les enregistrements dans une table qui a deux champs de texte: "paramètre" et "valeur". "Parameter" n'est pas unique et a beaucoup de doublons. Donc ce que j'ai l'intention de faire est:

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

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

Des indices?

Merci

Répondre

9

Il y a une façon peu IMHO plus simple à faire cela en utilisant « withDefault » introduit dans Groovy 1.7:

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

En aparté, avec Groovy 1.8+, vous pouvez faire ce qui suit 'all.groupBy {it.parameter} .collectEntries {k, v -> [(k): v * .value]} 'qui est potentiellement plus simple encore :-) –

+0

Aussi, avant Groovy 1.8 vous pouvez faire:' all.groupBy {it.parameter} .inject ([:]) { map, val -> map << [(val.key): val.value * .value]} ' –

+0

mais je suppose que ce qui précède est plus lisible. –

6

Vous pouvez utiliser la méthode Map.groupBy, qui va diviser la collection en une carte des groupes en fonction de la adoptée en fermeture. Voici un exemple complet, qui appelle également Collect pour faire de chaque point de paramètre à seulement les valeurs:

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 beaucoup mieux que ma réponse. Je code groovy comme Java ... obtient le travail vers le bas, mais pas au frais .... – hvgotcodes

Questions connexes