Java按matnr分组求和lfimg问题求助
解决相同物料编号对应数值分组求和的问题
我看了你这段代码,问题主要出在几个关键细节上,导致求和结果不对,而且代码本身也可以大幅简化。咱们一步步来梳理:
原代码的核心问题
- 字符串比较错误:Java中判断两个字符串内容是否相等要用
equals(),而你用了==——这会比较字符串对象的引用地址,而非内容,可能导致去重或匹配逻辑出错。 - 求和变量未重置:你的
value变量只初始化了一次,每次处理新物料时没有清零,导致后续求和是在前面的结果上持续累加,这就是输出越来越大的原因。 - 匹配逻辑错误:用
contains()判断物料编号匹配不合理,如果存在类似"16400"和"164000"的编号,会误判为匹配,应该直接用相等判断。 - 手动去重效率低:嵌套循环手动统计唯一物料的逻辑繁琐且易出错,Java里用
Map可以轻松实现分组累加,完全不需要这么复杂的步骤。
优化后的解决方案
我们可以用HashMap<String, Double>直接实现分组求和:Key存物料编号matnr,Value存对应的累加值。代码简洁逻辑清晰,还能规避上述所有问题:
import java.util.HashMap; import java.util.Map; public static void main(String[] args) { String[] matnr = new String[] { "16400", "56000", "56000", "50000", "16400" }; String[] lfimg = new String[] { "4.000", "5.000", "6.000", "9.000", "10.56" }; // 用Map存储每个物料对应的累加值 Map<String, Double> sumMap = new HashMap<>(); for (int i = 0; i < matnr.length; i++) { String material = matnr[i]; double quantity = Double.parseDouble(lfimg[i]); // 若Map中已有该物料则累加,无则初始化 sumMap.put(material, sumMap.getOrDefault(material, 0.0) + quantity); } // 遍历Map并格式化输出结果(保留三位小数) for (Map.Entry<String, Double> entry : sumMap.entrySet()) { String formattedValue = String.format("%.3f", entry.getValue()); System.out.println("Value1 >>> " + formattedValue); } }
代码说明
- 分组累加:
getOrDefault(material, 0.0)会先尝试获取物料对应的当前值,不存在则返回0.0,再加上当前的lfimg数值后存回Map。 - 正确匹配:Map的Key默认用
equals()判断字符串内容,完全符合需求。 - 格式对齐:用
String.format("%.3f", ...)把结果格式化为三位小数,和你期望的输出格式完全一致(比如14.56会自动补成14.560)。
测试输出
运行这段代码后,会得到你想要的结果:
Value1 >>> 14.560 Value1 >>> 11.000 Value1 >>> 9.000
(注:默认HashMap的遍历顺序不固定,如果需要保持物料首次出现的顺序,可以用LinkedHashMap代替HashMap)
内容的提问来源于stack exchange,提问作者subhamoy das
相关产品推荐
相关产品推荐

