Java银行账户程序:从文件提取正负浮点数及排序异常求助
问题分析与修复方案
问题根源
- 正则表达式错误:使用
[^0-9]会移除所有非数字字符,包括负号(-)、小数点(.)和千分位逗号(,),导致无法识别负数、带小数的数值,同时破坏了1,000.00这类带千分位的格式。 - 排序方法逻辑错误:
sortHighToLow方法直接尝试解析包含描述文本的整行字符串(如"-50.00 Dining out"),触发NumberFormatException;sortLowToHigh虽然做了正则替换,但替换逻辑错误,同样无法正确提取数值。 - 重复文件读取:
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
相关产品推荐
相关产品推荐

