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

Java获取逗号分割文本指定字段总和时,ArrayList重复存入中间累计值问题

问题成因

当前代码的存值逻辑写在逐行读取的while循环内部,只要每匹配到一次「季度为1、政府类型为联邦政府」的行,就会把刚累加完的临时sum值追加到ArrayList中,所以每处理完一条符合筛选条件的记录,列表就会多存一个当前节点的累计值,并不是等所有文件行处理完毕、sum完成全量计算后再存最终结果。
同时代码存在几个隐性问题,会直接导致运行报错或结果偏差:

  • 变量sum未做初始值初始化,直接累加会触发编译错误
  • 变量dollar如果没进入对应筛选分支,会处于未赋值状态,后续参与累加时同样会触发编译错误
  • 直接用split(",")分割带引号包裹的字段时,会把引号内部的逗号(比如"Dallas County, Alabama"字段里的逗号)也当作分割符,导致实际分割得到的字段长度和预期不一致,可能出现数组索引越界
修正方案
  1. 把往ArrayList存值的操作从循环内部移出,等所有行遍历完成、sum完成全量累计后,再一次性把最终总和存入列表
  2. 给所有临时计算变量补充初始值,避免未赋值的编译错误
  3. 如果需要正确处理带引号的逗号分隔文本,不能直接使用split(",")做简单分割,需要适配CSV格式的解析逻辑,避免引号内的内容被错误拆分

修正后的核心代码如下:

// 初始化存储总和的集合与累计变量
ArrayList<Double> totals = new ArrayList<Double>();
double sum = 0;
// while循环逐行读取文件内容
while (inputFile.hasNext()) {
    String currentLine = inputFile.nextLine();
    String[] fields = currentLine.split(",");
    int quarter = Integer.parseInt(fields[0].trim());
    String region = fields[1].trim();        
    int typeIndex;
    int dollarIndex;
    // 字段长度为4时,指定对应字段的索引值
    if (fields.length == 4) {
        typeIndex = 2;
        dollarIndex = 3;
    }
    // 字段长度超过4时,对应索引后移
    else {
        typeIndex = 3;
        dollarIndex = 4;
    }
    String govtType = fields[typeIndex].trim();
    if (region.equals("U.S. TOTAL")) {
        break;
    }
    double dollar = 0;
    // 符合区域或政府类型筛选条件时,将金额字段解析为double类型
    if (region.contains("Statewide") || govtType.contains("Federal Government") || govtType.contains("State Government")) {
        dollar = Double.parseDouble(fields[dollarIndex].trim());
    }
    // 满足季度为1且为联邦政府类型的筛选条件时,累计金额总和
    if (quarter == 1 && govtType.contains("Federal Government")) {
        sum += dollar;
    }
} // while循环结束
// 所有行处理完成后,再将最终总和存入集合
totals.add(sum);
System.out.println(totals);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 07:06:03