java 實現(xiàn)比較版本號功能
涉及到客戶端的系統(tǒng)中經(jīng)常需要用到比較版本號的功能,但是比較版本號又不能完全按照字符串比較的方式去用compareTo之類的方法;
這就需要我們總結(jié)版本號的通用規(guī)則,設(shè)計一個比較算法并封裝成通用方法來使用:
通常版本號如:1.3.20.8,6.82.20160101,8.5a/8.5c等;
通用規(guī)則就是,先將版本字符串按照點號分割,然后主版本與主版本比較、此版本與此版本比較,如此按序一級一級往后比較,直到有分出大??;
值得注意的是,很多比較版本號的方法都先將字符串轉(zhuǎn)換成int或者double類型,這樣做未必通用,因為可能含有字母,如8.5c這樣的版本號;
通用的方式依然是將分割后的字符串當做字符串來比較,不過,比較字符串之前,先比較位數(shù);
比較版本號的方法示例:
/**
* 比較版本號的大小,前者大則返回一個正數(shù),后者大返回一個負數(shù),相等則返回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("\\.");//注意此處為正則匹配,不能用".";
String[] versionArray2 = version2.split("\\.");
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;
}
//如果已經(jīng)分出大小,則直接返回,如果未分出大小,則再比較位數(shù),有子版本的為大;
diff = (diff != 0) ? diff : versionArray1.length - versionArray2.length;
return diff;
}
注意:其中 split 方法入?yún)檎齽t匹配表達式,不能用"."("."在正則表達式里匹配任何值),需要用"\\.",才算是按點號分割;
這樣,先分割成子串數(shù)組,再挨個比較子版本號,比較子版本號時,先比較位數(shù),位數(shù)大的就大,位數(shù)一樣時再按字符串比較方式比較;
如果全部比較完(其中一個版本號比較完)之后,再看一下哪個版本號有更更多的子版本號,也就是分割后的數(shù)組長度,有子版本號的為大;
這樣就比較完善地考慮了各種情況,并比較出版本號大小;包括有字母后綴的也可以使用;
如 "9.9", "10.8.8.6" ,如果直接按字符串比較,則會前者大,后者小,而明顯是錯誤的;分割后比較第一個主版本9與10,從位數(shù)上,就已經(jīng)得出結(jié)果后者大;
再如 "9.9b", "9.8a" 等也適用,如果用轉(zhuǎn)換成int或者double的方法就不適用.
相關(guān)文章
解決Maven本地倉庫明明有對應的jar包但還是報找不到的問題
這篇文章主要介紹了解決Maven本地倉庫明明有對應的jar包但還是報找不到的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
一種新的日期處理方式之JavaScript Temporal API
JavaScript Temporal API是一種為Web開發(fā)人員提供了一種新的處理日期和時間數(shù)據(jù)類型的方式。它的目的是使操作日期和時間更加簡單和可靠,而且不用擔心歷史時區(qū)問題或全球化協(xié)調(diào)時間(UTC)之類的問題,感興趣的同學可以參考閱讀2023-05-05
Liquibase結(jié)合SpringBoot使用實現(xiàn)數(shù)據(jù)庫管理功能
Liquibase 是一個強大的數(shù)據(jù)庫管理工具,它幫助你通過自動化管理數(shù)據(jù)庫的變更、版本控制、和回滾,簡化了開發(fā)中的數(shù)據(jù)庫遷移工作,這篇文章主要介紹了Liquibase結(jié)合SpringBoot使用實現(xiàn)數(shù)據(jù)庫管理,需要的朋友可以參考下2024-12-12

