java算法軟件版本比較

軟件版本比較:例如2.2.3和2.1.1這兩個版本號,哪個更新?
其實,客戶端版本檢測更新,檢測後臺是否有更新版本可更新,Java中最簡單的一種方法便是獲取當前客戶端版本號,與服務端提供的最新版本號做equals對比即可。
假設當前客戶端版本號爲oldVersion 後臺提供最新客戶端版本號爲newVersion
通過if (oldVersion.equals(newVersion))即可判斷是否有新版本。這種判斷只是比較本地版本號字符串和後臺版本號是否完全一致來做判斷的。但這存在一個問題,假如後臺版本號比當前版本號低,oldVersion.equals(newVersion)同樣爲true,這樣就會引起一個問題,軟件會被更新爲比當前版本更低的版本,顯然這不是我們所期望的。
那麼如何避免這個問題呢,最好做版本號大小的判斷。最初想到的一個方法便是把版本號轉爲double型數據再進行比較 比如版本號1.2.2便通過替換掉字符串中除第一個”.”之外的所有”.”再通過 Double.valueOf(String)方法轉換爲Double類型的值進行比較。用這種方法確實可以比較版本號的大小,比如版本號1.2.2和1.2.3便是比較1.22和1.23的大小,顯然比較結果版本號1.2.3大於1.2.2,結果正確。
/**
* 判斷是否爲最新版本
*
* @param oldVersion
* 本地版本號
* @param newVersion
* 線上版本號
*/
public static boolean isNewVersionDouble(String oldVersion, String newVersion)
{
if (oldVersion == null || newVersion == null)
{
return false;
}

    return parseStrVersionCodeToDouble(newVersion).compareTo(parseStrVersionCodeToDouble(oldVersion)) > 0 ? true
            : false;
}

/**
 * 將字符串型版本號轉換爲Double型版本號
 * 
 * @param versionCode
 * @return
 */
private static Double parseStrVersionCodeToDouble(String versionCode)
{
    if (versionCode.contains("."))
    {
        String versionStr = versionCode.substring(0, versionCode.indexOf(".") + 1)
                + versionCode.substring(versionCode.indexOf(".") + 1).replace(".", "");
        return Double.valueOf(versionStr);
    }
    else
    {
        return Double.valueOf(versionCode);
    }
}

後來看到網上可以直接使用String.compareTO方法比較,便嘗試了,直接讓newVersion.compareTo(oldVersion) 可以達到與轉換爲double類型比較相同的效果。
/**
* String.comparTo方法
*
* @param oldVersion
* @param newVersion
* @return
*/
public static boolean isNewVersionStr(String oldVersion, String newVersion)
{
if (oldVersion == null || newVersion == null)
{
return false;
}
return newVersion.compareTo(oldVersion) > 0 ? true : false;

}

但上述兩個方法在比較兩個點之間爲單位數的版本號(例如2.2.1和2.3.1)時能返回正確結果,但在比較兩個點之間不都爲單位數版本號(如2.2.1和2.12.1)時便返回了錯誤的結果,顯然版本號2.12.1要大於2.2.1但返回結果卻恰恰相反。爲什麼呢?使用轉換爲double 比較方法時,實際比較的是2.21和2.121這兩個數值的大小,顯然2.21大於2.121,這個方法返回了錯誤的結果不難理解。而使用String.compareTo方法時實際是依次比較字符串各個字符的Unicode value大小,顯然當比到第一個小數點後的值時2>1所以便得出了版本號2.2.1大於2.12.1的錯誤結果。
至此,我們可以得出一個結論,直接使用String.compareTo方法可以達到轉換Double再比較相同的效果,因此,第一種轉換double再比較的方法就沒有了存在的意義,只是更麻煩點、更低效而已。但我們比較兩點之間多位版本號的目的使用String.compareTo方法並不能實現。怎麼比才能在任何情況下都返回正確結果呢。我想到的一個便是通過點切分版本號爲數組在依次比較數組中各個值的大小,這樣就不會出現比較中認爲2比12大的情況。
/**
* 判斷是否爲最新版本方法 將版本號根據.切分爲int數組 比較
*
* @param oldVersion
* 舊版本號
* @param newVersion
* 新版本號
* @return
*/
public static boolean isAppNewVersion(String oldVersion, String newVersion)
{
if (oldVersion.equals(newVersion))
{
return false;
}
String[] oldArray = oldVersion.split(“\.”);
String[] newArray = newVersion.split(“\.”);

    int length = oldArray.length < newArray.length ? oldArray.length : newArray.length;

    for (int i = 0; i < length; i++)
    {
        if (Integer.parseInt(newArray[i]) > Integer.parseInt(oldArray[i]))
        {
            return true;
        }
        else if (Integer.parseInt(newArray[i]) < Integer.parseInt(oldArray[i]))
        {
            return false;
        }
        // 相等 比較下一組值
    }

    return true;
}
發佈了32 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章