两个Map对应值相乘求和的最优实现方法
同键Map值乘积求和实现方案
原代码问题分析
- 两层for循环对两个Map的值做了全量笛卡尔积遍历,4个元素的场景下会产生16次无效计算,时间复杂度为O(n²),性能极差
- 代码中没有做累加操作,每次循环都会直接覆盖
total的值,最终只会保留最后一次循环的计算结果,和预期逻辑不符
正确实现方案
仅需要遍历其中一个Map的键,直接取另一个Map相同键对应的值相乘后累加即可,时间复杂度为O(n),4个元素的场景下仅需要4次计算:
普通循环实现
Map<String, Integer> map1= new HashMap<>(); Map<String, Integer> map2= new HashMap<>(); map1.put("one", 1); map1.put("two", 2); map1.put("three", 3); map1.put("four", 4); map2.put("one", 1); map2.put("two", 2); map2.put("three", 3); map2.put("four", 4); int total = 0; for (String key : map1.keySet()) { total += map1.get(key) * map2.getOrDefault(key, 0); } System.out.println(total); // 输出结果:30
说明:使用getOrDefault是为了兼容极端情况下两个Map键不匹配的场景,如果你可以确定两个Map键完全一致,直接用get(key)即可
Java 8+ Stream 简化实现
int total = map1.entrySet().stream() .mapToInt(entry -> entry.getValue() * map2.get(entry.getKey())) .sum();
内容的提问来源于stack exchange,提问作者JuiceWorld
相关产品推荐
相关产品推荐

