Java中如何将多项式字符串存入TreeMap并对同幂次系数累加
解决方案
核心逻辑
问题本质是Map默认put操作对重复key的覆盖机制,只需要在存入前对已存在的key做值累加即可,常见实现方式有以下3种:
方法1:手动判断key是否存在(兼容所有Java版本)
存入新的幂次和系数前,先调用containsKey()方法判断该幂次是否已经存在:
- 不存在:直接调用
put(幂次, 系数)存入 - 已存在:取出旧的系数值,和新系数求和后再调用
put()覆盖旧值
示例代码片段:
TreeMap<Integer, Integer> polyMap = new TreeMap<>(); String a = "1x^2 2x^3 3x^4 4x^4 "; // 先按空格拆分所有项 String[] terms = a.trim().split(" "); for (String term : terms) { // 拆分系数和幂次:按x^拆分,^是正则特殊字符需要转义 String[] parts = term.split("x\\^"); int coefficient = Integer.parseInt(parts[0]); int power = Integer.parseInt(parts[1]); // 手动判断处理重复key if (polyMap.containsKey(power)) { polyMap.put(power, polyMap.get(power) + coefficient); } else { polyMap.put(power, coefficient); } }
方法2:使用merge方法(Java 8+ 推荐写法)
Java 8为Map接口新增了merge方法,专门处理重复key的值合并逻辑,不需要手动写判断分支,代码更简洁。merge方法三个参数分别是:目标key、key不存在时的默认存入值、key存在时的合并逻辑,示例代码仅需要替换方法1中的if-else判断部分即可:
polyMap.merge(power, coefficient, Integer::sum);
这行代码完全等价于方法1的整段if-else逻辑:如果幂次不存在就直接存入系数,存在就将新旧系数求和后存入。
方法3:使用compute方法(Java 8+)
也可以用compute方法实现相同效果,逻辑和merge类似:
polyMap.compute(power, (k, oldVal) -> oldVal == null ? coefficient : oldVal + coefficient);
以上三种方法最终输出的TreeMap都是{2=1, 3=2, 4=7},符合预期结果。
内容的提问来源于stack exchange,提问作者JKL
相关产品推荐
相关产品推荐

