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

Java银行账户程序:从文件提取正负浮点数及排序异常求助

问题分析与修复方案

问题根源

  1. 正则表达式错误:使用[^0-9]会移除所有非数字字符,包括负号(-)、小数点(.)和千分位逗号(,),导致无法识别负数、带小数的数值,同时破坏了1,000.00这类带千分位的格式。
  2. 排序方法逻辑错误:sortHighToLow方法直接尝试解析包含描述文本的整行字符串(如"-50.00 Dining out"),触发NumberFormatException;sortLowToHigh虽然做了正则替换,但替换逻辑错误,同样无法正确提取数值。
  3. 重复文件读取:numberOfTransactions、bankTransactions、bankTransactionsValues三次读取同一文件,效率低下。

修复步骤

1. 编写统一的数值提取工具方法

创建extractFloatValue方法,负责从每行文本中提取并转换为合法的浮点数:

  • 按空格分割每行,取第一个字段(数值部分)
  • 移除千分位逗号(Java浮点数解析不支持逗号分隔)
  • 转换为float类型

2. 修复排序方法

在sortLowToHigh和sortHighToLow中使用工具方法提取数值,避免直接解析整行或错误的正则替换。

3. 优化文件读取逻辑

一次性读取所有文件行,避免重复IO操作。

修复后的完整代码

package recursionReadFile;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class BankAccount { // 类名遵循大驼峰命名规范

    // 统一提取数值的工具方法
    private static float extractFloatValue(String line) {
        // 分割行,取第一个部分(数值字段)
        String valueStr = line.split("\\s+")[0];
        // 移除千分位逗号
        valueStr = valueStr.replace(",", "");
        return Float.parseFloat(valueStr);
    }

    // 一次性读取所有交易记录
    private static List<String> readAllTransactions() throws IOException {
        List<String> transactions = new ArrayList<>();
        try (BufferedReader reader = new BufferedReader(new FileReader("D:\\Garis\\Desktop\\Programs\\recursionReadFile\\src\\recursionReadFile\\BankAccount.txt"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                transactions.add(line);
            }
        }
        return transactions;
    }

    public static String[] sortLowToHigh(String[] transactionValues) {
        for (int index = 1; index < transactionValues.length; index++) {
            String item = transactionValues[index];
            float itemValue = extractFloatValue(item);

            int toPlace = index;
            while (toPlace > 0 && itemValue < extractFloatValue(transactionValues[toPlace - 1])) {
                transactionValues[toPlace] = transactionValues[toPlace - 1];
                toPlace--;
            }
            transactionValues[toPlace] = item;
        }
        return transactionValues;
    }

    public static String[] sortHighToLow(String[] transactionValues) {
        for (int index = 1; index < transactionValues.length; index++) {
            String item = transactionValues[index];
            float itemValue = extractFloatValue(item);

            int toPlace = index;
            while (toPlace > 0 && itemValue > extractFloatValue(transactionValues[toPlace - 1])) {
                transactionValues[toPlace] = transactionValues[toPlace - 1];
                toPlace--;
            }
            transactionValues[toPlace] = item;
        }
        return transactionValues;
    }

    public static void introduction() throws IOException {
        List<String> transactionList = readAllTransactions();
        String[] transactions = transactionList.toArray(new String[0]);
        transactions = sortLowToHigh(transactions);
        for (String transaction : transactions) {
            System.out.println(transaction);
        }
    }

    public static void main(String[] args) throws IOException {
        introduction();
    }
}

关键修复点说明

  • 工具方法extractFloatValue:解决了负数、小数、千分位数值的提取问题,确保能正确转换为float。
  • 统一文件读取:readAllTransactions方法一次性读取所有行,使用try-with-resources自动关闭流,避免资源泄漏。
  • 排序方法修复:两个排序方法均使用工具方法提取数值,避免了解析整行文本的错误。
  • 类名规范:将原类名bankAccount改为BankAccount,符合Java命名规范。

验证结果

运行修复后的代码,将按数值从小到大输出所有交易记录,例如:

-200.00  Rent payment
-150.00  Shopping
-100.00  Groceries
-100.00  Medical expenses
-80.00  Internet bill
-75.00  Utility bill
-60.00  Entertainment
-50.00  Dining out
-50.00  Gym membership
-30.00  Gasoline
75.00  Sale of a personal item
100.00  Bonus
150.00  Gift from a family member
150.00  Rental income
200.00  Freelance work payment
250.00  Cashback rewards
300.00  Tax refund
400.00  Investment dividend
500.00  Reimbursement from insurance
1,000.00  Salary

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:57:19