You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}

代码说明

  1. 分组累加:getOrDefault(material, 0.0)会先尝试获取物料对应的当前值,不存在则返回0.0,再加上当前的lfimg数值后存回Map。
  2. 正确匹配:Map的Key默认用equals()判断字符串内容,完全符合需求。
  3. 格式对齐:用String.format("%.3f", ...)把结果格式化为三位小数,和你期望的输出格式完全一致(比如14.56会自动补成14.560)。

测试输出

运行这段代码后,会得到你想要的结果:

Value1 >>> 14.560
Value1 >>> 11.000
Value1 >>> 9.000

(注:默认HashMap的遍历顺序不固定,如果需要保持物料首次出现的顺序,可以用LinkedHashMap代替HashMap)

内容的提问来源于stack exchange,提问作者subhamoy das

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:07:37