Groovy如何使用groupby收集数据

Groovy如何使用groupby收集数据,groovy,Groovy,我需要将列表转换为art: def a = [ [ "BU": "A101", "Order No": "1", "Line No":"1", "Item No": "OT275" ], [ "BU": "A101", "Order No": "1", &q

我需要将列表转换为art:

def a = [ [ "BU": "A101", "Order No": "1", "Line No":"1", "Item No": "OT275"  ], [ "BU": "A101", "Order No": "1", "Line No":"2", "Item No": "OT277" ], ["BU": "A102", "Order No": "2", "Line No":"1", "Item No": "OT278" ]];

我使用
groupby()
来收集数据

def b = a.groupBy({it."BU"},{it."Order No"});
println(b)
输出为:

[A101:[1:[[BU:A101, Order No:1, Line No:1, Item No:OT275 ], [BU:A101, Order No:1, Line No:2, Item No:OT277 ]]], A102:[2:[[BU:A102, Order No:2, Line No:1, Item No:OT278 ]]]]

这不是我想要的格式,如下所示

[
    [
        "BU": "A101",
        "Order No": "1",
        "Detail": [
            [
                "Line No": "1",
                "Item No": "OT275" 
            ],
            [
                "Line No": "2",
                "Item No": "OT277" 
            ]
        ]
    ],
    [
        "BU": "A102",
        "Order No": "2",
        "Detail": [
            [
                "Line No": "1",
                "Item No": "OT278" 
            ]
        ]
    ]
]
我的问题:如何使用List.groupby函数收集此格式。步骤如下:

  • 通过提取仅包含感兴趣的键的地图进行分组(
    BU
    , 带有
    子映射的组的
    订单号
    (创建映射,而不是 这里有更常见的列表,因为我们可以为结果重复使用映射)
  • 然后变换结果:这是一个以贴图为键的贴图和一个列表 所有行项目
    • 对于每个键:向“键”(结果)添加一个新的kew键
      详细信息
      映射)并从值(行项目列表)中收集
      
      subMap
      您感兴趣的(
      行号
      项目号
      )作为
      详细信息
      ;返回现在修改的“密钥”
例如

集合组(集合分组键、字符串详细信息键、集合详细信息键、集合源){
来源:groupBy{
it.subMap分组键
}.收集{k,v->
k+[(detailsKey):v.collect{it.subMap detailKeys}]
}
}
def a=[“BU”:“A101”,“订单号”:“1”,“行号”:“1”,“项目号”:“OT275”],[“BU”:“A101”,“订单号”:“1”,“行号”:“2”,“项目号”:“OT277”],[“BU”:“A102”,“订单号”:“2”,“行号”:“1”,“项目号”:“OT278”];
println组([“BU”、“订单号”]、“详细信息”、[“行号”、“项目号”]、a)
// → [[BU:A101,订单号:1,详细信息:[[1号行,项目号:OT275],[2号行,项目号:OT277]],[BU:A102,订单号:2,详细信息:[[1号行,项目号:OT278]]
注意:您可以通过减去
groupingKeys
从您的一个项目的键集中选择,以防您只需要所有非分组键

您尝试的问题是:

groupBy
使用多个提取器将创建一个嵌套地图。这 是有用的,但您只需要一个级别。所以你必须写 一键提取器,只返回顶级。比如说
a.groupBy{[it['BU'],it['Order No']}
可以工作。在那之后,是
只是一个塑造结果的问题。

错误消息
:没有方法签名:java.util.LinkedHashMap.tap()适用于参数类型:(main$\u group\u closure2$\u closure3)值:[main$\u group\u closure2$_closure3@2b662a77]可能的解决方案:max(groovy.lang.Closure)、take(int)、wait()、any()、grep()、dump()我将tap替换为只添加了映射的记录:tap版本不能与Groovy一起工作
Collection<Map> group(Collection<String> groupingKeys, String detailsKey, Collection<String> detailKeys, Collection source) {
    source.groupBy{ 
        it.subMap groupingKeys
    }.collect{ k, v ->
        k + [(detailsKey): v.collect{ it.subMap detailKeys }]
    }
}

def a = [ [ "BU": "A101", "Order No": "1", "Line No":"1", "Item No": "OT275"  ], [ "BU": "A101", "Order No": "1", "Line No":"2", "Item No": "OT277" ], ["BU": "A102", "Order No": "2", "Line No":"1", "Item No": "OT278" ]];
println group(["BU", "Order No"], "Details", ["Line No", "Item No"], a)
// → [[BU:A101, Order No:1, Details:[[Line No:1, Item No:OT275], [Line No:2, Item No:OT277]]], [BU:A102, Order No:2, Details:[[Line No:1, Item No:OT278]]]]