Java银行系统改造:Luhn算法实现与ArrayList适配及个人号码校验
解决方案:银行系统改造 + Luhn校验实现
嘿,作为Java初学者,你提的这两个需求都很典型,我来给你一步步拆解实现方案,代码示例都给你写好,直接就能用~
一、把账户存储从固定数组改为ArrayList
原来的银行系统里,你可能是用类似Account[] accounts = new Account[MAX_SIZE];这样的固定长度数组来管理账户。换成ArrayList会更灵活,不用预先设定大小,增删操作也更方便。
改造步骤:
- 替换数组为ArrayList:
把原来的数组声明改成泛型的ArrayList,比如:// 原来的固定数组 // private Account[] accounts = new Account[100]; // 改成ArrayList private List<Account> accounts = new ArrayList<>(); - 修改账户操作逻辑:
- 添加账户:原来的
accounts[index] = new Account(...);换成accounts.add(new Account(...)); - 获取账户:原来的
accounts[index]换成accounts.get(index) - 遍历账户:用for-each循环更简洁,比如:
for (Account account : accounts) { // 处理每个账户 System.out.println(account.getAccountNumber()); }
- 添加账户:原来的
- 优势说明:
- 自动扩容,不用再担心数组满了的问题
- 提供了丰富的API(比如
remove()、contains()),简化账户管理逻辑
二、在Client类中添加6位个人号码并实现Luhn校验
完全可以在Client类中添加个人号码字段,并且在set方法中通过Luhn算法做校验,这样就能保证存入的号码都是有效的。
实现思路:
- 添加私有字段:用
String类型存储个人号码(避免丢失前导零,比如号码001234用数字类型会变成1234) - 实现Luhn校验工具方法:写一个私有方法来判断号码是否符合Luhn规则
- 在set方法中校验:设置号码时先调用校验方法,无效则抛出异常或提示
完整Client类代码示例:
public class Client { private String name; // 添加6位个人号码字段 private String personalNumber; // 构造方法 public Client(String name) { this.name = name; } // Getter方法 public String getName() { return name; } public String getPersonalNumber() { return personalNumber; } // Setter方法,带Luhn校验 public void setPersonalNumber(String personalNumber) { // 先做基础校验:长度必须是6,且全为数字 if (personalNumber == null || personalNumber.length() != 6 || !personalNumber.matches("\\d+")) { throw new IllegalArgumentException("个人号码必须是6位数字!"); } // 调用Luhn校验方法 if (!isValidLuhn(personalNumber)) { throw new IllegalArgumentException("无效的个人号码,不符合Luhn校验规则!"); } this.personalNumber = personalNumber; } // 私有Luhn校验实现方法 private boolean isValidLuhn(String number) { int sum = 0; boolean alternate = false; // 从右往左遍历每一位数字 for (int i = number.length() - 1; i >= 0; i--) { int digit = Integer.parseInt(number.substring(i, i + 1)); if (alternate) { digit *= 2; // 如果乘积大于9,减去9(等价于各位数字相加) if (digit > 9) { digit -= 9; } } sum += digit; alternate = !alternate; } // 总和能被10整除则有效 return sum % 10 == 0; } }
测试示例:
public class Main { public static void main(String[] args) { Client client = new Client("张三"); // 有效的6位Luhn号码:499277 try { client.setPersonalNumber("499277"); System.out.println("设置成功,个人号码:" + client.getPersonalNumber()); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } // 无效号码(长度不够) try { client.setPersonalNumber("12345"); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); // 输出:个人号码必须是6位数字! } // 无效号码(不符合Luhn规则) try { client.setPersonalNumber("123456"); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); // 输出:无效的个人号码,不符合Luhn校验规则! } } }
关键细节说明:
- 用
String存号码:避免前导零丢失,同时方便逐位处理 - 基础校验先做:先判断长度和是否为数字,再做Luhn校验,逻辑更清晰
- 异常处理:通过抛出
IllegalArgumentException来提示错误,调用方可以捕获并处理
内容的提问来源于stack exchange,提问作者Skorpan
相关产品推荐
相关产品推荐

