前言
新的需求展示内容和旧接口稍有不同。但改动很小,不适合加新接口。
试错
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;
这样逐位对比更加科学。
后语
方法都是好方法,选自己适合的最重要~