java map 多个key_jdk1.8 操作List<Map> 多个map 具有相同的key 进行分组合并重组数据...

本文介绍了如何使用Java 1.8的Stream API将包含多个Map的List进行分组和合并,特别是在数据中存在相同key的情况下。通过提供一个mergeKey,实现了根据该key对Map进行分组,并将所有Map的entry合并到一个新的Map中,对于未出现的key赋予0的默认值。代码示例展示了具体的实现过程,并提醒注意分组时key的值的数据类型对结果的影响。
摘要由CSDN通过智能技术生成

一:我们有这么一列数据:

676eaae539256e73360ed59bd58ac32f.png

数据格式

m1的数据格式如下:  margeKey 是 要按照 那个key来进行分组,key 名字

[{active_user=2, company_id=13}, {active_user=1, company_id=126}, {company_id=13, material_num=13}, {company_id=126, material_num=2}, {company_id=13, learning_duration=4315.0}, {company_id=126, learning_duration=5.0}, {company_id=13, daily_answer_times=2}, {company_id=126, daily_answer_times=2}, {company_id=126, exam_times=1}]

使用如下代码,组装成:

代码如下:

public static List> merge(List> m1,String mergeKey){

Set set = new HashSet<>();

System.out.println("m1的数据格式是:"+m1);

return m1.stream()

.filter(map->map.get(mergeKey)!=null)

.collect(Collectors.groupingBy(o->{

//暂存所有key

set.addAll(o.keySet());

//按mergeKey分组

return o.get(mergeKey).toString();

}))

.entrySet().stream().map(o->{

//合并

Map map = o.getValue().stream().flatMap(m->{

return m.entrySet().stream();

}).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a,b)->b));

//为没有的key赋值0

set.stream().forEach(k->{

if(!map.containsKey(k)) map.put(k, 0);

});

return map;

}).collect(Collectors.toList());

}

// 一些个人碰坑总结:

// 通过分组的时候,一定的注意 分组的key 的value 的数据类型,数据类型不一样,分组出的结果不一样。

组装成的数据格式如下:

a4191f74af531c54b1f9de9054a70a31.png

要将字符串转换为List<Map<String, List<Integer>>>类型的数组,你可以按照以下步骤进行实现: 1. 首先,将字符串解析为JSON格式对象。你可以使用JSON库(如Jackson或Gson)来完成这一步骤。假设你已经将字符串解析为一个名为"jsonObject"的JSON对象。 2. 接下来,创建一个List<Map<String, List<Integer>>>类型的数组。我们可以称之为"result"。 3. 遍历"jsonObject"中的每个元素。对于每个元素,执行以下步骤: - 创建一个新的Map<String, List<Integer>>类型的对象,我们可以称之为"map"。 - 遍历当前元素中的每个键值对。对于每个键值对,执行以下步骤: - 将键转换为String类型,我们可以称之为"key"。 - 将值转换为List<Integer>类型,我们可以称之为"value"。 - 将"key"和"value"添加到"map"中。 - 将"map"添加到"result"数组中。 4. 当遍历完所有元素后,"result"数组将包含所有转换后的数据。 以下是一个示例代码: ```java import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Main { public static void main(String[] args) { String jsonString = "your_json_string"; ObjectMapper objectMapper = new ObjectMapper(); try { // Step 1: Parse the jsonString to a JSON object Object jsonObject = objectMapper.readValue(jsonString, Object.class); // Step 2: Create a List<Map<String, List<Integer>>> array List<Map<String, List<Integer>>> result = new ArrayList<>(); // Step 3: Iterate over each element in the jsonObject for (Map.Entry<String, Object> entry : ((Map<String, Object>) jsonObject).entrySet()) { Map<String, List<Integer>> map = new HashMap<>(); // Step 3.1: Iterate over each key-value pair in the current element for (Map.Entry<String, Object> innerEntry : ((Map<String, Object>) entry.getValue()).entrySet()) { String key = innerEntry.getKey(); List<Integer> value = (List<Integer>) innerEntry.getValue(); // Step 3.2: Add the key-value pair to the map map.put(key, value); } // Step 3.3: Add the map to the result array result.add(map); } // Step 4: The result array now contains the converted data for (Map<String, List<Integer>> map : result) { System.out.println(map); } } catch (Exception e) { e.printStackTrace(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值