基于java语言的版本号大小比较判断的通用方法

首先版本号的数字长度不定,中间逗号数量不定。
网上没有找到可以借鉴的方法,无奈自己写一个

思路是- 将其无规则的版本号转换成数据,然后对数字进行比较。这里思路简单明了就是为了尽可能满足业务下的版本号的比较
String versionStartString = “1.1.1.65.221”;
String versionEndString = “1.652.221”;
String versionCurrentString = “1.234321.615.221”;
这里进行补0,转换为一下字符串
// 1 000001 000001 000065 000221
//1 000652 000221
//1 234321 000615 000221
再将上面字符串转化为数字,进行大小比较
1000001000001000065000221
1000652000221
1234321000615000221

bigdecimal支持的位数很长天然支持上面大小比较
下面为代码



    public static void main(String[] args) {
        BigDecimal bigDecimal = new BigDecimal("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
        BigDecimal bigDecimal2 = new BigDecimal("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
        // 先验证下bigdecimal支持的位数计算肯定满足业务
        // 1234567901234567901234567901234567901234567901234567901234567901234567901234567901234555555555555555555555554320987654320987654320987654320987654320987654320987654320987654320987654320987654321
        System.out.println(bigDecimal.multiply(bigDecimal2));


        String versionStartString = "1.1.1.65.221";
        String versionEndString = "1.652.221";
        String versionCurrentString = "1.234321.615.221";
        // 校验
        Assert.state(isNumeric(versionStartString.replace(" ", "").replace(".", "")), "格式错误");
        Assert.state(isNumeric(versionEndString.replace(" ", "").replace(".", "")), "格式错误");
        Assert.state(isNumeric(versionCurrentString.replace(" ", "").replace(".", "")), "格式错误");

        String[] split1 = versionStartString.replace(" ", "").split("\\.");
        String[] split2 = versionEndString.replace(" ", "").split("\\.");
        String[] split3 = versionCurrentString.replace(" ", "").split("\\.");
        // 找到最长的数,按照他进行补零操作
        String maxLength1 = Arrays.stream(split1).max((v1, v2) -> v1.length() - v2.length()).get();
        String maxLength2 = Arrays.stream(split2).max((v1, v2) -> v1.length() - v2.length()).get();
        String maxLength3 = Arrays.stream(split3).max((v1, v2) -> v1.length() - v2.length()).get();
        int maxLength = Math.max(Math.max(maxLength1.length(), maxLength2.length()), maxLength3.length());
        // 如果是6,就是1000000
        BigDecimal times = new BigDecimal("1");
        for (int i = 0; i < maxLength; i++) {
            times = times.multiply(new BigDecimal("10"));
        }

        // 最大组数
        int maxSplit = Math.max(Math.max(split1.length, split2.length), split3.length);
        BigDecimal res1 = new BigDecimal("0");
        BigDecimal res2 = new BigDecimal("0");
        BigDecimal res3 = new BigDecimal("0");

        for (int i = 1; i <= maxSplit; i++) { //1,2,3,4
            BigDecimal tmp = new BigDecimal("1");
            for (int j = 1; j < i; j++) { // 乘以i次
                tmp = tmp.multiply(times);
            }
            if (maxSplit - i - (maxSplit - split1.length) >= 0) {
                res1 = res1.add(tmp.multiply(new BigDecimal(split1[maxSplit - i - (maxSplit - split1.length)])));
            }
            if (maxSplit - i - (maxSplit - split2.length) >= 0) {
                res2 = res2.add(tmp.multiply(new BigDecimal(split2[maxSplit - i - (maxSplit - split2.length)])));
            }
            if (maxSplit - i - (maxSplit - split3.length) >= 0) {
                res3 = res3.add(tmp.multiply(new BigDecimal(split3[maxSplit - i - (maxSplit - split3.length)])));
            }
        }
        boolean flag = true; // 默认满足条件
        if (res1.compareTo(res3) > 0 || res3.compareTo(res2) > 0) {
            flag = false; // 校验发现不满去条件
        }
        System.out.println(res1);
        System.out.println(res2);
        System.out.println(res3);
        // 最大长度是6,每一组自动补齐6位
        // 1  000001  000001  000065  000221
        //1  000652  000221
        //1  234321  000615  000221
        
        /* 打印输出结果如下
            1234567901234567901234567901234567901234567901234567901234567901234567901234567901234555555555555555555555554320987654320987654320987654320987654320987654320987654320987654320987654320987654321
            1000001000001000065000221
            1000652000221
            1234321000615000221
         */
    }

    public static boolean isNumeric(String str) {
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher isNum = pattern.matcher(str);
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值