zoukankan      html  css  js  c++  java
  • Java实现比较版本号

    原文:http://www.cnblogs.com/yucongblog/p/5600312.html

    涉及到客户端的系统中经常需要用到比较版本号的功能,但是比较版本号又不能完全按照字符串比较的方式去用compareTo之类的方法;

    这就需要我们总结版本号的通用规则,设计一个比较算法并封装成通用方法来使用:

    通常版本号如:1.3.20.8,6.82.20160101,8.5a/8.5c等;

    通用规则就是,先将版本字符串按照点号分割,然后主版本与主版本比较、此版本与此版本比较,如此按序一级一级往后比较,直到有分出大小;

    值得注意的是,很多比较版本号的方法都先将字符串转换成int或者double类型,这样做未必通用,因为可能含有字母,如8.5c这样的版本号;

    通用的方式依然是将分割后的字符串当做字符串来比较,不过,比较字符串之前,先比较位数;

    比较版本号的方法示例:

    /** 
     * 比较版本号的大小,前者大则返回一个正数,后者大返回一个负数,相等则返回0 
     * @param version1 
     * @param version2 
     * @return 
     */  
    public static int compareVersion(String version1, String version2) throws Exception {  
        if (version1 == null || version2 == null) {  
            throw new Exception("compareVersion error:illegal params.");  
        }  
        String[] versionArray1 = version1.split("\.");//注意此处为正则匹配,不能用".";  
        String[] versionArray2 = version2.split("\.");  
        int idx = 0;  
        int minLength = Math.min(versionArray1.length, versionArray2.length);//取最小长度值  
        int diff = 0;  
        while (idx < minLength  
                && (diff = versionArray1[idx].length() - versionArray2[idx].length()) == 0//先比较长度  
                && (diff = versionArray1[idx].compareTo(versionArray2[idx])) == 0) {//再比较字符  
            ++idx;  
        }  
        //如果已经分出大小,则直接返回,如果未分出大小,则再比较位数,有子版本的为大;  
        diff = (diff != 0) ? diff : versionArray1.length - versionArray2.length;  
        return diff;  
    }

    注意:其中 split 方法入参为正则匹配表达式,不能用"."("."在正则表达式里匹配任何值),需要用"\.",才算是按点号分割;

    这样,先分割成子串数组,再挨个比较子版本号,比较子版本号时,先比较位数,位数大的就大,位数一样时再按字符串比较方式比较;

    如果全部比较完(其中一个版本号比较完)之后,再看一下哪个版本号有更更多的子版本号,也就是分割后的数组长度,有子版本号的为大;

    这样就比较完善地考虑了各种情况,并比较出版本号大小;包括有字母后缀的也可以使用;

    如 "9.9", "10.8.8.6" ,如果直接按字符串比较,则会前者大,后者小,而明显是错误的;分割后比较第一个主版本9与10,从位数上,就已经得出结果后者大;

    再如 "9.9b", "9.8a" 等也适用,如果用转换成int或者double的方法就不适用;

  • 相关阅读:
    vue使用elementui合并table
    使用layui框架导出table表为excel
    vue使用elementui框架,导出table表格为excel格式
    前台传数据给后台的几种方式
    uni.app图片同比例缩放
    我的博客
    【C语言】取16进制的每一位
    SharePoint Solution 是如何部署的呢 ???
    无效的数据被用来用作更新列表项 Invalid data has been used to update the list item. The field you are trying to update may be read only.
    SharePoint 判断用户在文件夹上是否有权限的方法
  • 原文地址:https://www.cnblogs.com/shihaiming/p/6286575.html
Copyright © 2011-2022 走看看