批量生成连续的n个满足000000~ZZZZZZ(不包含4)的号

/**
 * SN号生成器
 */
public class RescueSnUtil {
    /** 救助牌号正则 */
    private final static String SN_REGEX = "^[012356789A-Z]{6}$";
    /** 救助牌号组成 */
    private final static String[] SN_ARR = new String[]{"0","1","2","3","5","6","7","8","9","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 final static String[] STR_ARR = new String[]{"0","1","2","3","4","5","6","7","8","9","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"} ;
    /** 进制 */
    private final static int SN_ARR_LENGTH = SN_ARR.length;
    /** 救助号牌长度 */
    private final static int SN_LENGTH = 6;
    /** 救助号牌对应最大整数 */
    private final static int SN_MIN = 0;
    /** 救助号牌对应最大整数 */
    private final static int SN_MAX = (int)Math.pow(SN_ARR_LENGTH, SN_LENGTH) - 1;

    //批量获取救助号
    public static synchronized WebResultDTO<String[]> getBatchRescueSign(String currentMaxSn, int delta){
        //currentMaxSn,begin
        if(StringUtils.isNotEmpty(currentMaxSn) && !currentMaxSn.matches(SN_REGEX)){
            return new WebResultDTO(400,ArrayUtils.EMPTY_STRING_ARRAY,"传入的最大救助号格式错误");
        }
        int currentMax = StringUtils.isEmpty(currentMaxSn)? -1 : convertSnToNum(currentMaxSn);
        int begin = currentMax + 1;
        if(begin<SN_MIN){
            return new WebResultDTO(400,ArrayUtils.EMPTY_STRING_ARRAY,"传入的当前最大救助号格式错误");
        }
        //delta
        if(delta<=0){
            return new WebResultDTO(400,ArrayUtils.EMPTY_STRING_ARRAY,"要生成的救助号数量格式错误");
        }
        //end
        int end = currentMax + delta;
        if(end>SN_MAX){
            return new WebResultDTO(400,ArrayUtils.EMPTY_STRING_ARRAY,"没有足够的救助号");
        }
        //snArr
        String[] snArr = new String[delta];
        for(int i=begin;i<=end;i++){
            snArr[i-begin] = StringUtils.leftPad(convertNumToSn(i), SN_LENGTH, "0") ;
        }
        return new WebResultDTO(200,snArr,"批量获取救助号成功");
    }

    //num转sn
    private static String convertNumToSn(int num) {
        //num转str
        String str = Integer.toString(num, SN_ARR_LENGTH).toUpperCase();
        //str转sn
        return StringUtils.replaceEach(str,STR_ARR,SN_ARR);
    }

    //sn转num
    private static Integer convertSnToNum(String sn) {
        //sn转str
        String str = StringUtils.replaceEach(sn,SN_ARR,STR_ARR);
        //str转num
        return Integer.valueOf(str, SN_ARR_LENGTH);
    }

    public static void main(String[] args) {
        // WebResultDTO dto = getBatchRescueSign("",SN_MAX + 1);
        System.out.println(new Date());
        WebResultDTO dto = getBatchRescueSign("",10000);
        System.out.println(new Date());
        // WebResultDTO dto = getBatchRescueSign(null,33);
        // WebResultDTO dto = getBatchRescueSign("",2);
        System.out.println(dto.getStatus());
        System.out.println(dto.getMsg());
        System.out.println(StringUtils.join(Arrays.asList((String[])dto.getData())));
    }



}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值