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

Java银行系统改造:Luhn算法实现与ArrayList适配及个人号码校验

解决方案:银行系统改造 + Luhn校验实现

嘿,作为Java初学者,你提的这两个需求都很典型,我来给你一步步拆解实现方案,代码示例都给你写好,直接就能用~

一、把账户存储从固定数组改为ArrayList

原来的银行系统里,你可能是用类似Account[] accounts = new Account[MAX_SIZE];这样的固定长度数组来管理账户。换成ArrayList会更灵活,不用预先设定大小,增删操作也更方便。

改造步骤:

  1. 替换数组为ArrayList:
    把原来的数组声明改成泛型的ArrayList,比如:
    // 原来的固定数组
    // private Account[] accounts = new Account[100];
    // 改成ArrayList
    private List<Account> accounts = new ArrayList<>();
    
  2. 修改账户操作逻辑:
    • 添加账户:原来的accounts[index] = new Account(...);换成accounts.add(new Account(...));
    • 获取账户:原来的accounts[index]换成accounts.get(index)
    • 遍历账户:用for-each循环更简洁,比如:
      for (Account account : accounts) {
          // 处理每个账户
          System.out.println(account.getAccountNumber());
      }
      
  3. 优势说明:
    • 自动扩容,不用再担心数组满了的问题
    • 提供了丰富的API(比如remove()、contains()),简化账户管理逻辑

二、在Client类中添加6位个人号码并实现Luhn校验

完全可以在Client类中添加个人号码字段,并且在set方法中通过Luhn算法做校验,这样就能保证存入的号码都是有效的。

实现思路:

  1. 添加私有字段:用String类型存储个人号码(避免丢失前导零,比如号码001234用数字类型会变成1234)
  2. 实现Luhn校验工具方法:写一个私有方法来判断号码是否符合Luhn规则
  3. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:04:52