The*_*McG 3 collections groovy
我有以下列表清单:
[FOO,1]
[FOO,2]
[BAR,1]
[BAR,2]
[BAR,3]
Run Code Online (Sandbox Code Playgroud)
我想将它转换为这样的地图:
FOO:[1,2]
BAR:[1,2,3]
Run Code Online (Sandbox Code Playgroud)
我觉得答案可能与使用groupBy或者注入有关,但我还不够"groovy"足够直观地知道最好的方法.思考?
所以,给定:
def list = [ ['FOO',1],
['FOO',2],
['BAR',1],
['BAR',2],
['BAR',3] ]
Run Code Online (Sandbox Code Playgroud)
Yu可以按每个列表中的第一个元素进行分组
def map = list.groupBy { it[ 0 ] }
Run Code Online (Sandbox Code Playgroud)
这给你:
[ 'FOO': [ ['FOO', 1], ['FOO', 2] ],
'BAR': [ ['BAR', 1], ['BAR', 2], ['BAR', 3] ] ]
Run Code Online (Sandbox Code Playgroud)
因此,您需要将值列表中的每个条目更改为列表中的第二个元素:
def result = list.groupBy { it[ 0 ] }
.collectEntries { key, value ->
[ key, value*.getAt( 1 ) ]
}
Run Code Online (Sandbox Code Playgroud)
这给你:
[ 'FOO': [ 1, 2 ],
'BAR': [ 1, 2, 3 ] ]
Run Code Online (Sandbox Code Playgroud)
按照要求 :-)
虽然tim_yates答案是正确的,但我想指出一个替代解决方案:
def result = [:].withDefault { [] } // initialize new keys with empty list
list.each {
result[it[0]] << it[1]
}
Run Code Online (Sandbox Code Playgroud)
此方法仅使用单个循环,执行时间应与列表大小成线性关系.
| 归档时间: |
|
| 查看次数: |
3179 次 |
| 最近记录: |