Java实现单号字母和数字混合且字母随着数字的递增而递增

博主要实现的需求是字母和数字的结合且字母随着数字的递增而递增。举例:AA0001 、AA0002 ... 、AA9999 、AB0001....

写这篇文章的时候,博主查阅了部分资料,发现大部分实现都是数字和字母剥离校验,即AA和0001分开实现,或者先纯数字后字母等等~

其实哪种实现都可以,只是,我们应该想下是否可以寻求最优解?

譬如:AA 和 0001分开实现,那么带来的问题是AA 和 0001是不是要分开存储,当0001 -> 9999时,AA - > AB ,这里也需要做关联实现。

因此,博主思路是沿用我们常规的储存方式,就保留一个数字递增,然后根据值来推算最后的结果等于AA0001。思路是通过求余和相除得到字母部分和数字部分。

举例:

由于我们需求是后面保留4位数字,所以最大值是 MAX_NUMBER = 9999

递增 1 的时候:

数字部分对最大数求余,1 % (MAX_NUMBER + 1) = 1 ,可以确认位数是 1,再String格式化,就是0001了。

字母部分直接相除最大数,1 / (MAX_NUMBER + 1),得到的是字母部分的值,然后推算字母部分的实现也是差不多同样的思路,相除和求余即可。

下面用具体代码实现:

    private static final int MAX_NUMBER = 9999; //数字最大值
    private static final int MAX_LETTERS = 26 * 26; //字母部分最大值

    private static String generateNumber(long value) {

        // 计算字母部分
        int letterIndex1 = (int) (value / (MAX_NUMBER + 1) % MAX_LETTERS);
        int letterIndex2 = (int) (value % (MAX_NUMBER + 1));
        char firstLetter = (char) ('A' + (letterIndex1 / 26));
        char secondLetter = (char) ('A' + (letterIndex1 % 26));

        // 计算数字部分
        int number = letterIndex2;
        String numberString = String.format("%04d", number);

        return String.valueOf(firstLetter) + secondLetter + numberString;
    }

其实总体实现思路就是,保留一个增长的数字,然后通过我们业务需求,进行求余和相除实现,而不是将字母和数字分开,各自实现。然后技术上只需要维护一个递增的数字即可。上述方式不一定是最好的实现,但是思路相对简单清晰,代码量相对也简单,并且拓展性还好,仅供参考。如果后续ZZ9999了,那就改下MAX_NUMBER = 9999 为 MAX_NUMBER = 99999,拓展一位即可。 

你可能感兴趣的:(java,算法,字母数字递增)