Groovy集合:转换地图中的列表列表

时间:2013-10-24 14:22:49

标签: collections groovy

我有以下列表清单:

[FOO,1]
[FOO,2]
[BAR,1]
[BAR,2]
[BAR,3]

我想将其转换为这样的地图:

FOO:[1,2]
BAR:[1,2,3]

我觉得答案可能与使用groupBy或者注入有关,但我还不够“groovy”足够直观地知道最好的方法。想法?

2 个答案:

答案 0 :(得分:6)

所以,给定:

def list = [ ['FOO',1],
             ['FOO',2],
             ['BAR',1],
             ['BAR',2],
             ['BAR',3] ]

Yu可以按每个列表中的第一个元素进行分组

def map = list.groupBy { it[ 0 ] }

这会给你:

[ 'FOO': [ ['FOO', 1], ['FOO', 2] ],
  'BAR': [ ['BAR', 1], ['BAR', 2], ['BAR', 3] ] ]

因此,您需要将值列表中的每个条目更改为列表中的第二个元素:

def result = list.groupBy { it[ 0 ] }
                 .collectEntries { key, value ->
                     [ key, value*.getAt( 1 ) ]
                 }

这会给你:

[ 'FOO': [ 1, 2 ],
  'BAR': [ 1, 2, 3 ] ]

根据要求: - )

答案 1 :(得分:5)

虽然tim_yates答案是正确的,但我想指出另一种解决方案:

def result = [:].withDefault { [] } // initialize new keys with empty list
list.each {
  result[it[0]] << it[1]
}

此方法仅使用单个循环,执行时间应与列表大小呈线性关系。