如何实现不超限取款求和并定位超限交易ID?
解决多笔取款超限检测的代码问题
需求说明
计算多笔取款的累计总和,确保不超过给定限额;当累计总和超限时,输出触发超限的那笔交易ID。
原代码的问题分析
原代码存在多处语法和逻辑错误,直接导致“无法解析符号'b.amount'”的错误,具体问题如下:
stream().map()仅支持单元素处理,不能传入(a,b)两个参数,这是b.amount无法解析的核心原因——map方法不会提供第二个元素参数- 参数
amoutLimit拼写错误(应为amountLimit),且未声明参数类型 - 代码中使用的
creditLimit变量未定义,实际应使用传入的限额参数 Customer类定义语法错误:用圆括号()替代了大括号{},且成员变量TransactionId的大小写与代码中引用的transactionId不匹配- 方法声明返回
String,但代码中返回Collections.emptyList(),返回值类型完全矛盾 - 输入示例是字符串列表,但方法参数是
List<Customer>,缺少字符串到Customer对象的转换逻辑
修正后的代码实现
import java.util.List; import java.util.Arrays; // 修正Customer类定义,统一命名规范并添加对象构造逻辑 class Customer { String firstName; String lastName; String email; int amount; String transactionId; public Customer(String inputStr) { String[] parts = inputStr.split(","); this.firstName = parts[0]; this.lastName = parts[1]; this.email = parts[2]; this.amount = Integer.parseInt(parts[3]); this.transactionId = parts[4]; } } public class WithdrawalLimitChecker { public static String findOverLimitTransaction(List<String> customerStrs, int amountLimit) { // 将输入字符串转换为Customer对象列表 List<Customer> customers = customerStrs.stream() .map(Customer::new) .toList(); int totalWithdrawal = 0; for (Customer customer : customers) { totalWithdrawal += customer.amount; // 累计后超过限额,返回当前交易ID if (totalWithdrawal > amountLimit) { return customer.transactionId; } } // 所有交易未超限,返回null或空字符串 return null; } // 测试示例 public static void main(String[] args) { List<String> input = Arrays.asList("John,Doe,john@doe.com,200,TrId1", "John,Doe,john@doe.com,2,TrId2"); int limit = 200; String result = findOverLimitTransaction(input, limit); System.out.println(result); // 输出:TrId2 } }
代码说明
- 修正
Customer类的语法错误,添加了从输入字符串生成对象的构造方法,解决输入格式匹配问题 - 改用普通循环实现累计求和,逻辑直观,便于跟踪累计总额和判断超限时机
- 修复了参数命名、类型声明、返回值类型等语法问题
- 测试代码直接验证输入示例,输出符合预期的
TrId2
内容的提问来源于stack exchange,提问作者learningUser
相关产品推荐
相关产品推荐

