博主要实现的需求是字母和数字的结合且字母随着数字的递增而递增。举例: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) % (26 * 26),得到的是字母部分的值,然后推算字母部分的实现也是差不多同样的思路,相除和求余即可。

下面用具体代码实现:

    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,拓展一位即可。 

写道在某些应用场景中,因业务需要,一般的流水号(前缀+日期或时间+流水号)规则无法满足业务需要,以下是因业务需要拓展出来的流水号生成规则业务要求:1.默认限定位数的数字递增2.在限定位数数字达到全部为9的时候,用字母替换最后一位,数字归0再次递增3.当字母长度为限定位数长度并且字母都为Z的时候,限定长度1预期结果(限定长度4位,从1开始):0001...9999...001A...001B...... 小编典典这里有3个解决方案:前两个是算术增量,而第三个更多是字符操作。这三个实现都通过相同的单元测试:assertEquals("1DDA01A", MyClass.increment("1DDA00Z"));assertEquals("1A9AV00", MyClass.increment("1A9AU99"));assertEquals("AFH00", MyClass.increment("... 这里注意传入的index是4, 即0,1,2,3,传入的columns为10个字母,因为有十列。由于本人实在懒,不想一个一个敲出来,索引进行了一番探究。打印lists结果为:是一个列表嵌套,为下一步打好基础。 前言:不知咋的脑袋抽筋的想到数字可以直接自增成序列要是字母呢该怎么增 aaa aab aac aad aae aaf aag aah aai aaj aak?于是就有了下面的代码。 匿名用户1级2014-05-29 回答importjava.util.LinkedList;publicclassReplaceNumber{publicstaticvoidmain(String[]args){LinkedListresult=newLinkedList();charr='0',g='0',b='0';Stringrgb=""+... for i in range(4): ran1 = str(random.randint(0,9)) # 0~9之间的数字 ran2 = chr(random.randint(65,90)) # a~z的字母 ran3 = chr(random.randint(97,122)) # A~Z的字母 您不能直接增字母数字值.如果要这样做,您需要为其编写一些代码行这是activity_main.xmlxmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_he... for 语句是应用最广泛、功能最强的一种循环语句。大部分情况下,for 循环可以代替 while 循环、do while 循环。for 语句是一种在程序执行前就要先判断条件表达式是否为真的循环语句。假如条件表达式的结果为假,那么它的循环语句根本不会执行。for 语句通常使用在知道循环次数的循环中。for 语句语法格式如下所示。for 循环中 3 个条件表达式的含义如表所示。for 关键字后面括号中的 3 个条件表达式必须用“;”隔开。 public class CreateCode { private static String []str_char = {"A","B","C","D","E","F","G","H", "I","J","K","L","M","N","O","P","Q", "R","S","T","U","V","W","X","Y","Z"}; private