JavaによるAndroidクライアントのバージョン番号比較


目次
  • ディレクトリ
  • 前言
  • キー
  • Javaコード実装
  • 前言
    朝CSDNブログランキングを見て、今週の最高順位の文章はJava実現比較バージョン番号です.個人的には、Androidクライアントシステムではバージョン番号比較機能がよく使われているため、特にアプリケーションがアップグレードされている場合によく使われていると思います.元ブロガーがこの文章を書いたのは、Javaプログラマーの多くがcompareToという頼りないAPI呼び出しや不規則なバージョン番号名を採用する可能性があることを考慮したためだ.私がこの文章を書いたのは、ACMのテーマを推賞し、元のブロガーコードの中で考えが不十分な場合を補充したからです.
    キー(Key)
    ここでは、クライアントのバージョン番号比較のキーを2つの問題に分けて説明します.
    String.compareToメソッドを使用してクライアントのバージョン番号を比較できないのはなぜですか?栗を挙げると、以前のクライアントバージョン番号は9.9.9で、サーバー側の最新のクライアントバージョン番号は:10.0.1で、10.0.1は明らかに9.9.9より高いが、compareToメソッドによると、この9.9.9.9は10.0.1より大きく、クライアントバージョン番号の比較エラーを招いた.
    元ブロガーコードにはどのような考慮が欠けていますか?元ブロガーは8.5 cという定義不可能なバージョン番号を考慮したが、バージョン番号のプリアンブル0の場合は考慮しなかった.たとえば、元のブロガーのコードに従って、バージョン番号1.0はバージョン番号1より大きい.
    どうしてACMのテーマを推奨しますか?ここでACMをお勧めするのは、LeetCodeの前のeasyの文字列比較問題、タイトルリンク:Compare Version Numberを通じて、このような問題を最初に考えたからです.元ブロガーのコードはACというテーマにはならない.
    Javaコード実装
    いくつか引っ張って、最後にやはりコードをshowして、以下は私のクライアントのバージョン番号がコードを比較して、ツッコミを歓迎します.
        public static int compareVersion(String version1, String version2) {
            if (version1.equals(version2)) {
                return 0;
            }
    
            String[] version1Array = version1.split("\\.");
            String[] version2Array = version2.split("\\.");
    
            int index = 0;
            int minLen = Math.min(version1Array.length, version2Array.length);
            int diff = 0;
    
            while (index < minLen && (diff = Integer.parseInt(version1Array[index]) - Integer.parseInt(version2Array[index])) == 0) {
                index ++;
            }
    
            if (diff == 0) {
                for (int i = index; i < version1Array.length; i ++) {
                    if (Integer.parseInt(version1Array[i]) > 0) {
                        return 1;
                    }
                }
    
                for (int i = index; i < version2Array.length; i ++) {
                    if (Integer.parseInt(version2Array[i]) > 0) {
                        return -1;
                    }
                }
    
                return 0;
            } else {
                return diff > 0 ? 1 : -1;
            }
        }