如何基于其他值对Map中的value3进行求和合并
按多键分组并求和value3的实现方案
问题场景
现有如下Groovy列表(元素为Map结构):
def myMap = [ [value1: "ABD123", value2: "Robert", value3: 1, value4: "7"], [value1: "ABD123", value2: "Robert", value3: 4, value4: "7"], [value1: "ABD13a23", value2: "Rob2ert", value3: 1, value4: "7"] ]
需要实现:当value1、value2、value4三者值完全相同时,将对应元素的value3求和,最终得到合并后的列表。
实现代码
def myMap = [ [value1: "ABD123", value2: "Robert", value3: 1, value4: "7"], [value1: "ABD123", value2: "Robert", value3: 4, value4: "7"], [value1: "ABD13a23", value2: "Rob2ert", value3: 1, value4: "7"] ] // 按指定三键分组并求和value3 def mergedMap = myMap.groupBy { item -> // 用三个值的组合作为分组键 [item.value1, item.value2, item.value4] }.collect { groupKey, items -> // 组装合并后的Map [ value1: groupKey[0], value2: groupKey[1], value3: items.sum { it.value3 }, value4: groupKey[2] ] } // 输出结果 mergedMap.each { println it }
代码说明
- 分组逻辑:通过
groupBy方法,将value1、value2、value4的组合作为分组标识,把所有匹配的元素归为同一组。 - 求和与组装:遍历每个分组,对组内元素的
value3调用sum方法求和,再结合分组键的值,生成新的Map元素。 - 结果验证:运行代码后,输出结果与需求完全一致:
[value1:ABD123, value2:Robert, value3:5, value4:7] [value1:ABD13a23, value2:Rob2ert, value3:1, value4:7]
内容的提问来源于stack exchange,提问作者Powjnk
相关产品推荐
相关产品推荐

