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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:36:03