列为grails中的地图值

xai*_*ain 5 grails groovy list map

我需要填充一个Map,以便:

  • Key是一个字符串
  • 值是一个字符串列表

该过程将遍历包含两个文本字段的表中的所有记录:"parameter"和"value"."参数"不是唯一的,有许多重复.所以我打算做的是:

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

all.each {
  // add to mymap the element "it.value" to the list that has "it.parameter" as key 
}
Run Code Online (Sandbox Code Playgroud)

有线索吗?

谢谢

Ste*_*ter 9

通过使用Groovy 1.7中引入的'withDefault',有一个IMHO更简单的方法:

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']
Run Code Online (Sandbox Code Playgroud)


ata*_*lor 7

您可以使用该Map.groupBy方法,该方法将基于传入的闭包将集合拆分为组映射.这是一个完整的示例,它还调用collect以使每个参数仅指向值:

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']]
Run Code Online (Sandbox Code Playgroud)

  • +1比我的答案好得多.我编写groovy作为java ...让工作失败,但不是很酷.... (4认同)