首页 > 解决方案 > 校验位计算改进或优化

问题描述

我现在在开发阶段使用了一个简单的校验位计算器。校验位取决于帐号和常数乘数2187654321。帐号为字符串格式。我需要将其拆分为整数数组。然后每个整数都需要分别乘以它们的乘数。

假设帐号是 08060002506。所以过程将是2x0 + 1x8 + 8x0...

我的问题是,如果有更多的优化方法来进行计算,有人可以建议吗?因为我将对大约数千个帐号进行计算。

这是我的代码

import java.util.Arrays;

class CheckDigit {
    public static void main(String[] args) {
        String accountNo = "08060002506";
        Integer[] multiplier = new Integer[]{2, 1, 8, 7, 6, 5, 4, 3, 2, 1};
        Object[] accountNoArr = convertAccountToIntArray(accountNo);

        int sum = getSum(multiplier, accountNoArr);

        int remainder = getRemainder(sum);
        int checkDigit = 9 - remainder;
        System.out.println("Check digit is = " + checkDigit);
    }

    private static Object[] convertAccountToIntArray(String accountNo) {
        return Arrays.stream(accountNo.split(""))
                .map(Integer::parseInt).toArray();
    }

    private static int getSum(Integer[] multiplier, Object[] accountNoArr) {
        int sum = 0;
        for (int i = 0, multiplierLength = multiplier.length; i < multiplierLength; i++) {
            Integer numToMultiply = (Integer) accountNoArr[i];
            Integer mul = multiplier[i];
            sum += mul * numToMultiply;
        }
        return sum;
    }

    private static int getRemainder(int sum) {
        return sum % 9;
    }
}

标签: javaalgorithm

解决方案


更喜欢String.charAt(int)和解析每个子字符串(并使用 an而不是 an )。就像是,Character.digit(char, int)String.split("")int[]Integer[]

public static void main(String[] args) {
    String accountNo = "08060002506";
    int[] multiplier = {2, 1, 8, 7, 6, 5, 4, 3, 2, 1};

    int sum = getSum(multiplier, accountNo);
    int remainder = getRemainder(sum);
    int checkDigit = 9 - remainder;
    System.out.println("Check digit is = " + checkDigit);
}

private static int getSum(int[] multiplier, String accountNo) {
    int sum = 0;
    for (int i = 0; i < multiplier.length; i++) {
        int numToMultiply = Character.digit(accountNo.charAt(i), 10);
        sum += multiplier[i] * numToMultiply;
    }
    return sum;
}

推荐阅读