java比较版本号

java比较版本号,比如1.0.3和1.2.1相比较考虑到可以用String的compareTo()方法,代码如下:

public class MainClass {
    public static void main(String[] args) {    

        String version1 = "1.0.3";
        String version2 = "1.2.1";
        
        int compareTo = version1.compareTo(version2);
        
        System.out.println(compareTo);
             
    }     
}

输出结果是-2,也就是说version1小,这是正确的。

但是,这种情况仅限于小数点左右的数字位数相同,如果不相同,会出现一下情况:

public class MainClass {
    public static void main(String[] args) {    

        String version1 = "5.2.3790.24123";
        String version2 = "5.11.7883";
        
        int compareTo = version1.compareTo(version2);
        
        System.out.println(compareTo);
    }    
}

这是输出结果是1,表示version1大,显然是错误的。

所以,正常逻辑应该是以小数点分隔,对应位置上的数字比较大小,代码如下:

public class MainClass {
    /**
     * 比较版本号的大小,前者大则返回一个正数,后者大返回一个负数,相等则返回0 
     */
    public static void main(String[] args) {    
        String version1 = "5.2.3790.24123";
        String version2 = "5.11.7883";
        
        String[] split1 = version1.split("\\.");  //以.分隔需要转义
        String[] split2 = version2.split("\\.");
        
        int length=Math.min(split1.length, split2.length);
        int diff=0;
        for(int i=0;i<length;i++){
            diff = split1[i].length()-split2[i].length();
            if(diff==0){   //位数相同时,比较大小
                if(split1[i].compareTo(split2[i])>0){
                    System.out.println("1");
                    break;
                }else if(split1[i].compareTo(split2[i])<0){
                    System.out.println("-1");
                    break;
                }else if(i==length-1){
                    System.out.println(length==split1.length? -1 : 1);
                }
                
            }else if(diff !=0){  //位数不同时,直接输出
                System.out.println(diff);
                break;
            }
            
        }
    }    
}