具有相同键和值对的映射

时间:2013-12-19 15:34:05

标签: groovy

我的记录为

firstRecord = [ [ name1:'value1', name2:'value2', name3:'value3'],
                [ name1:'value1', name2:'value4', name3:'value5' ] ]

我提取了一个列表,其中将name1的值设为

valueList = [ 'value1', 'value1' ]

我有另一张地图

secondRecord = [ value1:[ key1:'value9', key2:'value10' ] ]

我尝试循环浏览valueListsecondRecord.subMap( [ value1.toString() ] )

我有一张地图

[ value1: [ key1:'value9', key2:'value10' ] ]

我想要一张如下地图(因为valueList中有两个相同的值,我希望有两个具有相同值的键)

requiredMap = [ value1:[ key1:'value9', key2:'value10'],
                value1:[ key1:'value9', key2:'value10' ] ]

但由于它是一张地图,第二张会覆盖第一张,而我只留下一个键/值对。

这可以通过 Groovy 1.5.6 实现吗?

1 个答案:

答案 0 :(得分:0)

假设:

firstRecord = [ [ name1:'value1', name2:'value2', name3:'value3'],
                [ name1:'value1', name2:'value4', name3:'value5' ] ]

您可以通过以下方式获取valueList

valueList = firstRecord.name1

然后,给定secondRecord

secondRecord = [ value1:[ key1:'value9', key2:'value10' ] ]

你可以这样做:

result = valueList.inject( [:].withDefault { [] } ) { m, v ->
    m[ v ] << secondRecord[ v ]
    m
}

,并提供:

assert result == [ value1:[ [ key1:'value9', key2:'value10'],
                            [ key1:'value9', key2:'value10' ] ] ]

使用groovy 1.5.6 ,您需要执行以下操作:

result = valueList.inject( [:] ) { m, v ->
    if( !m[ v ] ) {
        m[ v ] = []
    }
    m[ v ] << secondRecord[ v ]
    m
}