Java实现两个List<Map<String,String>>的笛卡尔积并合并条目
实现思路
你需要在每轮配对两个Map时创建独立的新Map对象,将两个来源Map的键值对全部合并到这个新Map中,再存入结果集合,即可满足需求。
注意:Java的
Map本身不允许重复键,如果d1和d2存在同名键,后存入的d2的键值会覆盖d1的同名键值。你的示例中出现的重复PersonID在标准Java Map中无法保留,若需要保留重复字段建议调整数据结构(比如将值封装为列表、或者给键加前缀区分来源)。
正确实现代码
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public static List<Map<String, String>> cartesianProduct(List<Map<String, String>> d1, List<Map<String, String>> d2) { List<Map<String, String>> d3 = new ArrayList<>(); int s1 = d1.size(); int s2 = d2.size(); for (int i = 0; i < s1; i++) { for (int j = 0; j < s2; j++) { // 新建空Map用于存储合并后的键值对 Map<String, String> mergedMap = new HashMap<>(); // 先存入d1的当前条目所有键值 mergedMap.putAll(d1.get(i)); // 再存入d2的当前条目所有键值,同名键会覆盖d1的旧值 mergedMap.putAll(d2.get(j)); // 将合并后的单个Map加入结果集合 d3.add(mergedMap); } } return d3; }
代码说明
- 用
Map.putAll()方法替代了无效的+运算符,解决了HashMap不支持加法运算的问题 - 每轮配对仅向结果集合添加1个合并后的
mergedMap,解决了两个条目分开存储的问题
内容的提问来源于stack exchange,提问作者green tea
相关产品推荐
相关产品推荐

