早上看了1下CSDN博客排名,本周最高排名的文章是:Java實現比較版本號。個人認為這篇文章寫的不錯,由于Android客戶端系統中常常用到版本號比較功能,特別是在利用自升級的情況下。
原博主之所以寫這篇文章,是由于斟酌到大部份Java程序員可能會采取compareTo這類不靠譜的API調用或不規則的版本號名稱。
而我寫這篇文章,是由于對ACM題目的推重和補充1下原博主代碼中斟酌不夠周全的情況。
這里,分兩個問題來講明1下客戶端版本號比較的關鍵點。
為何不能使用String.compareTo方法來比較客戶端版本號?
舉個栗子,之前客戶端版本號為:9.9.9,而服務器端最新的客戶端版本號為:10.0.1,雖然10.0.1明顯高于9.9.9,但是依照compareTo方法,這個9.9.9是大于10.0.1的,致使客戶端版本號比較毛病。原博主代碼中欠缺哪些斟酌?
原博主斟酌了8.5c這類不太可能定義的版本號,卻沒有斟酌版本號中前導0的情況。例如,依照原博主的代碼,版本號1.0是大于版本號1的。為何推重ACM題目?
之所以這里推薦1下大家做ACM,是由于我最早思考這類問題是通過LeetCode上1道難度為easy的字符串比較題目,題目鏈接:Compare Version Number。而原博主的代碼是沒法AC這道題目的。
扯了1些,最后還是要show1下代碼的,以下是我的客戶端版本號比較代碼,歡迎吐槽。
public static int compareVersion(String version1, String version2) {
if (version1.equals(version2)) {
return 0;
}
String[] version1Array = version1.split(".");
String[] version2Array = version2.split(".");
int index = 0;
int minLen = Math.min(version1Array.length, version2Array.length);
int diff = 0;
while (index < minLen && (diff = Integer.parseInt(version1Array[index]) - Integer.parseInt(version2Array[index])) == 0) {
index ++;
}
if (diff == 0) {
for (int i = index; i < version1Array.length; i ++) {
if (Integer.parseInt(version1Array[i]) > 0) {
return 1;
}
}
for (int i = index; i < version2Array.length; i ++) {
if (Integer.parseInt(version2Array[i]) > 0) {
return -1;
}
}
return 0;
} else {
return diff > 0 ? 1 : -1;
}
}