Groovy-FindAll-由字段声明的唯一记录条件



我有一个json,如下

{
"Animals": [
{
"Name": "monkey",
"Age": 4
},
{
"Name": "lion",
"Age": 3
},
{
"Name": "lion",
"Age": 3,
"Misc": "001"
}
]
}

json数组中的3个元素中有2个元素具有Name和Age。唯一的区别是第三个元素有"杂项",而第二个元素没有"杂项"。

当有两个记录具有相同的名称和年龄时,如何获得具有Misc的记录

以下是我尝试的

parsedJson?.Animals = parsedJson?.Animals?.unique().findAll{animal -> animal?.Misc?.trim() ? animal?.Misc?.trim() : site?.Name?.trim() };

看起来我又错过了一个语句,或者我错过了unique((内部的某些内容我也试过

parsedJson?.Animals = parsedJson?.Animals?.unique{a1,a2 -> a1?.Misc <=> a2?.Misc}

但仍然没有得到我想要的

我想要的是

{
"Animals": [
{
"Name": "monkey",
"Age": 4
},
{
"Name": "lion",
"Age": 3,
"Misc": "001"
}
]
}

实现这一点的一种方法是对元素进行分组,然后进行合并地图。

CCD_ 1用于通过它们的"0"对元素进行分组;主键"——let假设这是NameAge。生成的数据结构为具有CCD_ 4元组和密钥的映射以及元素列表,持有该财产的人。

接下来,缩小地图列表并将其合并。这假设,那里的信息本身并不矛盾(例如,只会增加结果(。否则最后一张地图就会赢。

def data = [["Name": "monkey", "Age": 4], 
["Name": "lion", "Age": 3], 
["Name": "lion", "Age": 3, "Misc": "001"]]
println data.groupBy{[it.Name, it.Age]}.collect{ _, xs -> xs.inject{ acc, x -> acc.putAll x; acc } }
// → [[Name:monkey, Age:4], [Name:lion, Age:3, Misc:001]]

最新更新