一開始用String.compareTo,出現bug之后才明白了它的不完善地方。它的比較方式是按照字符串的比較來執行的,所以它有不正確的地方。舉個例子,之前客戶端版本號為:9.9.9,而服務器端最新的客戶端版本號為:10.0.1,雖然10.0.1明顯高於9.9.9,但是按照compareTo方法,這個9.9.9是大於10.0.1的,導致客戶端版本號比較錯誤。下面是分隔后的版本號單獨進行比較,不過,還是首先比較的個數
- /**
- * 比較版本號的大小,前者大則返回一個正數,后者大返回一個負數,相等則返回0
- 規則是按日期訂的例如:2.10.15 項目啟動第2年的8月15號
- * @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("\\.");//注意此處為正則匹配,不能用".";
for(int i = 0 ; i<versionArray1.length ; i++){ //如果位數只有一位則自動補零(防止出現一個是04,一個是5 直接以長度比較)
if(versionArray1[i].length() == 1){
versionArray1[i] = "0" + versionArray1[i];
}
}
String[] versionArray2 = version2.split("\\.");
for(int i = 0 ; i<versionArray2.length ; i++){//如果位數只有一位則自動補零
if(versionArray2[i].length() == 1){
versionArray2[i] = "0" + versionArray2[i];
}
}
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;
}