Groovy如何使用groupby收集数据
我需要将列表转换为art:Groovy如何使用groupby收集数据,groovy,Groovy,我需要将列表转换为art: def a = [ [ "BU": "A101", "Order No": "1", "Line No":"1", "Item No": "OT275" ], [ "BU": "A101", "Order No": "1", &q
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
,行号
)作为项目号
;返回现在修改的“密钥”详细信息
- 对于每个键:向“键”(结果)添加一个新的kew键
集合组(集合分组键、字符串详细信息键、集合详细信息键、集合源){
来源: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]]]]