国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java 實現比較版本號功能

2019-11-26 14:05:31
字體:
來源:轉載
供稿:網友

涉及到客戶端的系統中經常需要用到比較版本號的功能,但是比較版本號又不能完全按照字符串比較的方式去用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 {   if (version1 == null || version2 == null) {     throw new Exception("compareVersion error:illegal params.");   }   String[] versionArray1 = version1.split("http://.");//注意此處為正則匹配,不能用".";   String[] versionArray2 = version2.split("http://.");   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; } 

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

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

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

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 忻州市| 古浪县| 加查县| 乡城县| 西城区| 武邑县| 杂多县| 阿瓦提县| 年辖:市辖区| 新田县| 马公市| 新泰市| 凤凰县| 万盛区| 溧水县| 大埔区| 徐水县| 乌鲁木齐市| 隆化县| 纳雍县| 信阳市| 锡林郭勒盟| 开封市| 云南省| 明水县| 天门市| 大英县| 五台县| 昭通市| 洪江市| 龙游县| 徐汇区| 阿合奇县| 天等县| 乐亭县| 若羌县| 西峡县| 孟津县| 玉山县| 乳山市| 岢岚县|