Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从重复的映射值生成唯一键_Java_Groovy - Fatal编程技术网

Java 如何从重复的映射值生成唯一键

Java 如何从重复的映射值生成唯一键,java,groovy,Java,Groovy,我有一个包含地图列表的JSON: { "aprLimits": [{ "orgId": "Company 1", "rangeStart": "54936", "rangeEnd": "54936", "amountLimit": 100000 }, { "orgId": "Company 1", "rangeStart": "59434", "rangeEnd": "59434", "amountLimit": 0.01 }, {

我有一个包含地图列表的JSON:

{
"aprLimits": [{
    "orgId": "Company 1",
    "rangeStart": "54936",
    "rangeEnd": "54936",
    "amountLimit": 100000
}, {
    "orgId": "Company 1",
    "rangeStart": "59434",
    "rangeEnd": "59434",
    "amountLimit": 0.01
}, {
    "orgId": "Company 1",
    "rangeStart": "54345",
    "rangeEnd": "54345",
    "amountLimit": 0
}, {
    "orgId": "Company 1",
    "rangeStart": "54345",
    "rangeEnd": "54345",
    "amountLimit": 250000
}, {
    "orgId": "Company 2",
    "rangeStart": "043",
    "rangeEnd": "043",
    "amountLimit": 0.01
}, {
    "orgId": "Company 2",
    "rangeStart": "042",
    "rangeEnd": "042",
    "amountLimit": 1000
}, {
    "orgId": "Company 2",
    "rangeStart": "032",
    "rangeEnd": "032",
    "amountLimit": 0
}]}
我的目标是收集与唯一orgId对应的数据,方法是将其转换为一个键,并为其分配其余的值,因此最终结果如下所示:

["Company 1": [[54936, 54936, 100000], [59434, 59434, 0.01], [54345, 54345, 0], [54345, 54345, 250000]], "Company 2": [[043, 043, 0.01], [042, 042, 1000], [032, 032, 0]]]
我已经获得了唯一的orgId并将数据收集到列表中,但是我很难弄清楚如何将唯一键与列表关联

def slurper = new JsonSlurper()
def parsedJson = slurper.parseText(json)
def list = []
def orgIds = parsedJson.aprLimits.orgId.unique()

parsedJson.aprLimits.each {
if (orgIds.contains(it.orgId)) {
    data = new ArrayList(Arrays.asList(it.rangeStart, it.rangeEnd, it.amountLimit))
    list.add(data)
}}

这里的一个好的开始是
groupBy
,然后塑造所需的数据。Shorter是一个reduce,带有带有默认值的映射。例如

parsedJson.aprLimits.inject(
    [:].withDefault{[]} // if a key is missing, add it and make the value an empty vector
){ r, v -> 
    r[v.orgId] << [v.rangeStart, v.rangeEnd, v.amountLimit]
    r
}
parsedJson.aprrimites.inject(
[:]。使用默认值{[]}//如果缺少键,则添加该键并使该值为空向量
){r,v->

r[v.orgId]一个好的开始是
groupBy
,然后塑造你想要的数据。Shorter是带有默认值的映射的reduce

parsedJson.aprLimits.inject(
    [:].withDefault{[]} // if a key is missing, add it and make the value an empty vector
){ r, v -> 
    r[v.orgId] << [v.rangeStart, v.rangeEnd, v.amountLimit]
    r
}
parsedJson.aprrimites.inject(
[:]。使用默认值{[]}//如果缺少键,则添加该键并使该值为空向量
){r,v->

r[v.orgId]创建一个结果映射,而不是list
def map=[:]
,然后将成对的-orgId和新数组放入该映射
map.put(it.orgId,data)
由于存在重复的orgId值,因此只有循环的最后结果才会出现在映射中,例如[Company 1:[54345,54345,250000],Company 2:[032,032,0]]创建一个结果映射,而不是list
def map=[:]
,然后将成对的orgid和新数组放入该映射
map.put(it.orgid,data)
由于orgid的值重复,因此只有循环的最后一个结果才会出现在映射中,例如[公司1:[54345,54345,250000],公司2:[032,032,0]]