如何根据Groovy中的字段值,使用自定义键将对象列表组合到列表映射中?

时间:2016-08-16 17:43:03

标签: groovy

您好我是Groovy的新手并且一直在尝试这个但是无法提出正确的解决方案。

基本上我有一个对象列表,我需要将特定字段的一部分关联起来并将其放在带有转换键的地图中。在下面的示例中,我需要将第三个字段的值与前四个字符(例如key3,key4)相关联,并将它们放在一个映射中。所以所有key3对象和key4对象都在一个单独的地图中,并将它们组合在1个地图中,其中key3和key4作为键及其原始值列在列表中。

Foo[] foo = [
    ["field1a", "field2a", "key3a"],
    ["field1b", "field2b", "key3b"],
    ["field1c", "field2c", "key4c"]
]

    result = [
        "key3":[
            ["field1a", "field2a", "key3a"],
            ["field1b", "field2b", "key3b"]
        ],
        "key4":[
            ["field1c", "field2c", "key4c"]
        ]
    ]

到目前为止,我已经能够通过使用collect(),substring()和unique()的组合来获取唯一键,但是我无法正确构建地图。我使用了collectEntries(),但它只创建了一个对象的地图而不是一个列表地图。

如果有人能指出我正确的方向,那将真的是一个很大的帮助。谢谢!

1 个答案:

答案 0 :(得分:3)

使用groupBy

assert foo.groupBy { it[-1][0..-2] } == [
    key3:[
        ['field1a', 'field2a', 'key3a'], 
        ['field1b', 'field2b', 'key3b']
    ], 
    key4:[
        ['field1c', 'field2c', 'key4c']
    ]
]

说明:
按列表it[-1]中的第三个/最后一个元素进行分组,但只考虑子字符串key3,因此it[-1][0..-2]