Java實現比較版本號

2021-09-07 08:41:19 字數 1703 閱讀 6128

原文:

涉及到客戶端的系統中經常需要用到比較版本號的功能,但是比較版本號又不能完全按照字串比較的方式去用compareto之類的方法;

這就需要我們總結版本號的通用規則,設計乙個比較演算法並封裝成通用方法來使用:

通常版本號如:1.3.20.8,6.82.20160101,8.5a/8.5c等;

通用規則就是,先將版本字串按照點號分割,然後主版本與主版本比較、此版本與此版本比較,如此按序一級一級往後比較,直到有分出大小;

值得注意的是,很多比較版本號的方法都先將字串轉換成int或者double型別,這樣做未必通用,因為可能含有字母,如8.5c這樣的版本號;

通用的方式依然是將分割後的字串當做字串來比較,不過,比較字串之前,先比較位數;

比較版本號的方法示例:

/**

* 比較版本號的大小,前者大則返回乙個正數,後者大返回乙個負數,相等則返回0

* @param

version1

* @param

version2

* @return

*/public

static

int compareversion(string version1, string version2) throws

exception

string versionarray1 = version1.split("\\.");//

注意此處為正則匹配,不能用".";

string versionarray2 = version2.split("\\.");

int idx = 0;

int minlength = math.min(versionarray1.length, versionarray2.length);//

取最小長度值

int diff = 0;

while (idx && (diff = versionarray1[idx].length() - versionarray2[idx].length()) == 0//

先比較長度

&& (diff = versionarray1[idx].compareto(versionarray2[idx])) == 0)

//如果已經分出大小,則直接返回,如果未分出大小,則再比較位數,有子版本的為大;

diff = (diff != 0) ? diff : versionarray1.length -versionarray2.length;

return

diff;

}

注意:其中 split 方法入參為正則匹配表示式,不能用"."("."在正規表示式裡匹配任何值),需要用"\\.",才算是按點號分割;

這樣,先分割成子串陣列,再挨個比較子版本號,比較子版本號時,先比較位數,位數大的就大,位數一樣時再按字串比較方式比較;

如果全部比較完(其中乙個版本號比較完)之後,再看一下哪個版本號有更更多的子版本號,也就是分割後的陣列長度,有子版本號的為大;

這樣就比較完善地考慮了各種情況,並比較出版本號大小;包括有字母字尾的也可以使用;

如 "9.9", "10.8.8.6" ,如果直接按字串比較,則會前者大,後者小,而明顯是錯誤的;分割後比較第乙個主版本9與10,從位數上,就已經得出結果後者大;

再如 "9.9b", "9.8a" 等也適用,如果用轉換成int或者double的方法就不適用;

Java實現比較版本號

涉及到客戶端的系統中經常需要用到比較版本號的功能,但是比較版本號又不能完全按照字串比較的方式去用compareto之類的方法 這就需要我們總結版本號的通用規則,設計乙個比較演算法並封裝成通用方法來使用 通常版本號如 1.3.20.8,6.82.20160101,8.5a 8.5c等 通用規則就是,先...

java版本號比較

public static int versioncompareto string version1,string version2 for int i 0 i version2array.length i int size version1list.size version2list.size v...

版本號比較 java

思路 將版本號按點分割,並轉成數字型別,放入list 取兩個版本位數的最大數,如 1.0.1為3位 1.0.0.1為4位 將位數不夠的版本進行補全,不夠部分補成0 從第一位開始比較,出現大於情況返回1,出現小於情況返回 1,後面的就不用再比較了,如果沒有出現大於和小於的情況,那只剩下等於了,for迴...