版本号version对比

235 阅读1分钟

前言

新的需求展示内容和旧接口稍有不同。但改动很小,不适合加新接口。

试错

private static Double parseStrVersionCodeToDouble(String versionCode) {
    if (versionCode.contains(".")) {
        String versionStr = versionCode.substring(0, versionCode.indexOf(".") + 1)
                + versionCode.substring(versionCode.indexOf(".") + 1).replace(".", "");
        return Double.valueOf(versionStr);
    } else {
        return Double.valueOf(versionCode);
    }
}

for example : versionCode = "3.1.9"

这种方法的思路主要是通过截取字符串,替换version中第二个"."为空,也就是去掉,让版本号转化成一个double类型的数。再比较大小。

所以,versionCode按照这种方法执行完就是3.19,这种方式有很大问题。因为只截取到了第二个点后一位的数据, 即如果3.1.10,就只能取到3.11。此时再比较大小,就出现了3.1.9>3.1.10这种情况。

这种方法也并不是不能用,只适用于三位数字的版本号而已。

正解

private static int compareVersion(String v1, String v2) {
    int i = 0, j = 0;
    int n = v1.length(), m = v2.length();
    while(i < n || j < m)
    {
        int num1 = 0, num2 = 0;
        while(i < n && v1.charAt(i) != '.') {
            num1 = num1 * 10 + v1.charAt(i++) - '0';
        }
        while(j < m && v2.charAt(j) != '.') {
            num2 = num2 * 10 + v2.charAt(j++) - '0';
        }
        if(num1 > num2) {
            return 1;
        } else if( num1 < num2) {
            return -1;
        }
        i++; j++;
    }
    return 0;
}

这种方法的思路变成了,一位一位的对比,比如v1=3.1.9,v2=3.1.10 它是分别取v1和v2由"."隔开的每一位分别对比

第一次对比:num1=3,num2=3;

第二次对比: num1=1,num2=1;

第三次对比:num1=9,num2=10;

这样逐位对比更加科学。

后语

方法都是好方法,选自己适合的最重要~