Java获取逗号分割文本指定字段总和时,ArrayList重复存入中间累计值问题
问题成因
当前代码的存值逻辑写在逐行读取的while循环内部,只要每匹配到一次「季度为1、政府类型为联邦政府」的行,就会把刚累加完的临时sum值追加到ArrayList中,所以每处理完一条符合筛选条件的记录,列表就会多存一个当前节点的累计值,并不是等所有文件行处理完毕、sum完成全量计算后再存最终结果。
同时代码存在几个隐性问题,会直接导致运行报错或结果偏差:
- 变量
sum未做初始值初始化,直接累加会触发编译错误 - 变量
dollar如果没进入对应筛选分支,会处于未赋值状态,后续参与累加时同样会触发编译错误 - 直接用
split(",")分割带引号包裹的字段时,会把引号内部的逗号(比如"Dallas County, Alabama"字段里的逗号)也当作分割符,导致实际分割得到的字段长度和预期不一致,可能出现数组索引越界
修正方案
- 把往ArrayList存值的操作从循环内部移出,等所有行遍历完成、sum完成全量累计后,再一次性把最终总和存入列表
- 给所有临时计算变量补充初始值,避免未赋值的编译错误
- 如果需要正确处理带引号的逗号分隔文本,不能直接使用
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
相关产品推荐
相关产品推荐

