1. 程式人生 > >Java實現Android客戶端版本號比較

Java實現Android客戶端版本號比較

目錄

前言

早上看了一下CSDN部落格排名,本週最高排名的文章是:Java實現比較版本號。個人認為這篇文章寫的不錯,因為Android客戶端系統中經常用到版本號比較功能,特別是在應用自升級的情況下。
原博主之所以寫這篇文章,是因為考慮到大部分Java程式設計師可能會採用compareTo這種不靠譜的API呼叫或者不規則的版本號名稱。
而我寫這篇文章,是由於對ACM題目的推崇和補充一下原博主程式碼中考慮不夠周全的情況。

關鍵點

這裡,分兩個問題來說明一下客戶端版本號比較的關鍵點。

為什麼不能使用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題目?
之所以這裡推薦一下大家做ACM,是因為我最早思考這類問題是通過LeetCode上一道難度為easy的字串比較題目,題目連結:Compare Version Number。而原博主的程式碼是無法AC這道題目的。

Java程式碼實現

扯了一些,最後還是要show一下程式碼的,以下是我的客戶端版本號比較程式碼,歡迎吐槽。

    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; } }