java 實(shí)現(xiàn)比較版本號(hào)功能
涉及到客戶端的系統(tǒng)中經(jīng)常需要用到比較版本號(hào)的功能,但是比較版本號(hào)又不能完全按照字符串比較的方式去用compareTo之類的方法;
這就需要我們總結(jié)版本號(hào)的通用規(guī)則,設(shè)計(jì)一個(gè)比較算法并封裝成通用方法來(lái)使用:
通常版本號(hào)如:1.3.20.8,6.82.20160101,8.5a/8.5c等;
通用規(guī)則就是,先將版本字符串按照點(diǎn)號(hào)分割,然后主版本與主版本比較、此版本與此版本比較,如此按序一級(jí)一級(jí)往后比較,直到有分出大??;
值得注意的是,很多比較版本號(hào)的方法都先將字符串轉(zhuǎn)換成int或者double類型,這樣做未必通用,因?yàn)榭赡芎凶帜?,?.5c這樣的版本號(hào);
通用的方式依然是將分割后的字符串當(dāng)做字符串來(lái)比較,不過(guò),比較字符串之前,先比較位數(shù);
比較版本號(hào)的方法示例:
/** * 比較版本號(hào)的大小,前者大則返回一個(gè)正數(shù),后者大返回一個(gè)負(fù)數(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);//取最小長(zhǎng)度值 int diff = 0; while (idx < minLength && (diff = versionArray1[idx].length() - versionArray2[idx].length()) == 0//先比較長(zhǎng)度 && (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匹配表達(dá)式,不能用"."("."在正則表達(dá)式里匹配任何值),需要用"\\.",才算是按點(diǎn)號(hào)分割;
這樣,先分割成子串?dāng)?shù)組,再挨個(gè)比較子版本號(hào),比較子版本號(hào)時(shí),先比較位數(shù),位數(shù)大的就大,位數(shù)一樣時(shí)再按字符串比較方式比較;
如果全部比較完(其中一個(gè)版本號(hào)比較完)之后,再看一下哪個(gè)版本號(hào)有更更多的子版本號(hào),也就是分割后的數(shù)組長(zhǎng)度,有子版本號(hào)的為大;
這樣就比較完善地考慮了各種情況,并比較出版本號(hào)大??;包括有字母后綴的也可以使用;
如 "9.9", "10.8.8.6" ,如果直接按字符串比較,則會(huì)前者大,后者小,而明顯是錯(cuò)誤的;分割后比較第一個(gè)主版本9與10,從位數(shù)上,就已經(jīng)得出結(jié)果后者大;
再如 "9.9b", "9.8a" 等也適用,如果用轉(zhuǎn)換成int或者double的方法就不適用.
相關(guān)文章
解析Spring Boot 如何讓你的 bean 在其他 bean&n
在 SpringBoot 中如何讓自己的某個(gè)指定的 Bean 在其他 Bean 前完成被 Spring 加載?我聽(tīng)到這個(gè)問(wèn)題的第一反應(yīng)是,為什么會(huì)有這樣奇怪的需求?下面小編給大家分析下Spring Boot 如何讓你的 bean 在其他 bean 之前完成加載 ,感興趣的朋友一起看看吧2024-01-01SpringBoot自動(dòng)配置@EnableAutoConfiguration過(guò)程示例
這篇文章主要為大家介紹了SpringBoot自動(dòng)配置@EnableAutoConfiguration的過(guò)程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10java實(shí)現(xiàn)文件編碼轉(zhuǎn)換的方法
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件編碼轉(zhuǎn)換的方法,分享一個(gè)文件編碼轉(zhuǎn)換的工具類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Java之SpringCloud nocos注冊(cè)中心講解
這篇文章主要介紹了Java之SpringCloud nocos注冊(cè)中心講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Spring創(chuàng)建Bean的過(guò)程Debug的詳細(xì)流程
這篇文章主要介紹了Spring創(chuàng)建Bean的過(guò)程Debug的流程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Spring Jpa多數(shù)據(jù)源工程配置過(guò)程解析
這篇文章主要介紹了Spring Jpa多數(shù)據(jù)源工程配置過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08