Java读取销售文件存入2D数组时扫描字符串转换及求和异常问题
销售业绩统计问题解决方案
原代码核心错误点
- 二维数组
sales定义在while循环内部,每次循环都会重新初始化,之前累加的数值会全部丢失,必须移到循环外部声明 - 文件读取逻辑错误:循环内重复调用
nextLine()会导致隔行丢失数据,无需额外声明重复指向扫描器的file变量 - 金额字段为带小数的字符串,直接使用
Integer.parseInt()转换会抛出格式异常,教授要求用int类型存储的话,可将金额转换为「分」为单位的整数,既满足int存储要求,又能避免浮点运算精度丢失 - 缺少人员累计业绩、产品总销售额的统计逻辑,以及最终打印输出的代码
修正后可运行代码
package HW1; import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class salesList { // 按照需求提前定义固定的人员数量、产品数量,可根据实际业务调整 private static final int PERSON_COUNT = 4; private static final int PRODUCT_COUNT = 6; public static void main(String[] args) throws FileNotFoundException { // 二维数组存储每位销售对应各单品的销售额,单位为分,int存储 int[][] sales = new int[PERSON_COUNT][PRODUCT_COUNT]; Scanner salesScanner = new Scanner(new File("C:\\Users\\mjwag\\OneDrive\\cs151/salesList.txt")); while (salesScanner.hasNextLine()) { String line = salesScanner.nextLine().trim(); // 跳过空行 if (line.isEmpty()) continue; String[] lineArray = line.split(","); int personID = Integer.parseInt(lineArray[0].trim()); int productNum = Integer.parseInt(lineArray[1].trim()); // 金额转成分为单位的int,避免精度问题 double amountYuan = Double.parseDouble(lineArray[2].trim()); int amountCent = (int) Math.round(amountYuan * 100); // 存入二维数组,索引从0开始所以减1 sales[personID - 1][productNum - 1] += amountCent; } salesScanner.close(); // 统计每位销售人员的累计业绩 int[] personTotal = new int[PERSON_COUNT]; for (int i = 0; i < PERSON_COUNT; i++) { int sum = 0; for (int j = 0; j < PRODUCT_COUNT; j++) { sum += sales[i][j]; } personTotal[i] = sum; } // 统计各产品的整体总销售额 int[] productTotal = new int[PRODUCT_COUNT]; for (int j = 0; j < PRODUCT_COUNT; j++) { int sum = 0; for (int i = 0; i < PERSON_COUNT; i++) { sum += sales[i][j]; } productTotal[j] = sum; } // 按格式打印输出 System.out.println("===== 每位销售对应各单品销售额(单位:元) ====="); for (int i = 0; i < PERSON_COUNT; i++) { System.out.printf("销售%d:", i + 1); for (int j = 0; j < PRODUCT_COUNT; j++) { System.out.printf("产品%d:%.2f ", j + 1, sales[i][j] / 100.0); } System.out.printf("累计业绩:%.2f%n", personTotal[i] / 100.0); } System.out.println("===== 各产品整体总销售额(单位:元) ====="); for (int j = 0; j < PRODUCT_COUNT; j++) { System.out.printf("产品%d:%.2f ", j + 1, productTotal[j] / 100.0); } } }
实现说明
- 金额存储逻辑:将元为单位的小数金额乘以100四舍五入为整数分,使用int存储完全满足精度要求,输出时除以100.0即可还原为带两位小数的正常金额格式
- 存储结构完全符合要求,仅使用二维数组存储核心销售明细数据,未使用任何List集合
- 所有统计逻辑均基于二维数组遍历计算,符合题目要求
内容的提问来源于stack exchange,提问作者matthew wagner
相关产品推荐
相关产品推荐

