Java生成层级目录编码

最近项目里面有个生成编号的需求,具体的要求就是:

1、一级编号从01开始,一直到99,当超过99的时候,从001开始,到999,以此类推

2、二级和三级编号从001开始,到999,超过999,从0001开始,以此类推

3、二级编号前面要拼接上对应的一级编号,比如一级编号为01,下面挂着第一个二级编号为01001,第二个为01002,。。。。三级编号要拼接上对对应的二级编号,比如二级编号为01001,下面挂着两个三级编号,分别为01001001,01001002.。。。

下面就需求的第一条和第二条代码实现做一下笔记记录,第三条实现相对简单,因为在生成编号的时候一定会用到父级编号,所以只需要在生成的编号前面加上拼接上父级编号即可,废话不多说,直接上代码:

public class NumGenerate {

    /**
     * 根据当前的编码最大值生成编码
     *
     * @param curNo 当前编号
     * @param initLength
     * @return
     */
    public String getNextNumber(String curNo, int initLength) {
        return getNextNumber(Integer.parseInt(curNo), initLength);
    }

    /**
     * 根据当前的最大值生成编码
     *
     * @param currentMax 当前最大值
     * @param initLength 初始长度,默认为2,也就是从01开始
     * @return
     */
    public String getNextNumber(Integer currentMax, int initLength) {
        currentMax++;
        return formatNumber(currentMax, initLength);
    }

    /**
     * 格式化
     * @param number
     * @param initLength
     * @return
     */
    private String formatNumber(int number, int initLength) {
        int digits = initLength; // 初始为 2 位

        // 根据当前编号确定所需的位数
        while (number > Math.pow(10, digits) - 1) {
            digits++;
        }
        return String.format("%0" + digits + "d", number % 10 == 0 && digits > initLength ? 1 : number);
    }

    public static void main(String[] args) {
        NumGenerate generator = new NumGenerate();
        for (int i = 0; i <= 99; i++) {
            System.out.print("," + generator.getNextNumber(i, 2));
        }
        System.err.println();
        System.err.println("-----------------------------------------");
        for (int i = 0; i <= 999; i++) {
            System.out.print("," + generator.getNextNumber(i, 3));
        }
    }
}

单元测试:

    @Test
    public void getNextNumber1() {
        NumGenerate generator = new NumGenerate();
        System.err.println(generator.getNextNumber("01", 2));
        System.err.println(generator.getNextNumber("02", 2));
        System.err.println(generator.getNextNumber("99", 2));
        System.err.println(generator.getNextNumber("98", 2));
        System.err.println(generator.getNextNumber("999", 2));
        System.err.println(generator.getNextNumber("998", 2));
        System.err.println("----------------------------------------------");
        System.err.println(generator.getNextNumber("01", 3));
        System.err.println(generator.getNextNumber("02", 3));
        System.err.println(generator.getNextNumber("99", 3));
        System.err.println(generator.getNextNumber("98", 3));
        System.err.println(generator.getNextNumber("999", 3));
        System.err.println(generator.getNextNumber("998", 3));
        System.err.println(generator.getNextNumber("9999", 3));
        System.err.println(generator.getNextNumber("9998", 3));
    }

其中最核心的就是formatNumber方法,入参是当前已经生成的编号的最大值和初始化的长度,当前编号通常是记录在缓存或者数据库里面,直接查询即可,然后转成int类型的传入,formatNumber方法的while就是在判断99,999这种临界值,如果小于临界值,最后的return就是直接返回传入的编号加1的值,一级编号的时候(初始长度为2),比如传入的是01,那么返回02,传入10,返回11,如果传入的是99,那么最后的digits的值就是3,返回的就是001,二级编号的时候(初始长度为3),比如传入的是01,那么返回02,传入10,返回11,如果传入的是99,返回100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值