www.350.vip:RPM包的版本号比较

其三条法规是列表分段相比较算法
        具体的算法应用于多个待相比较的支行串,由于第二条原则的关系,这里的串只或许都以数字或都以字母,举例”12″、”abc”、”BETA”
        若是是数和数比较,那么三个串会看作八个整数进行自然数相比,前导的零会被忽略,”12″
-> 12,”00010″ -> 10。
        假若是字符串和字符串比较,那么博览会开有如 C 语言 strcmp()函数的逻辑,依照 ACSII
码顺序得出,排在前面包车型地铁为新本子,小写字母比大写字母新。
        若是是字符串和数比较,那么确定数比字符串新。
123 > 121
svn > rc
alpha > Beta
0 > beta

public int compareVersion(String version1, String version2) {
    String[] levels1 = version1.split("\\.");
    String[] levels2 = version2.split("\\.");

    int length = Math.max(levels1.length, levels2.length);
    for (int i=0; i<length; i++) {
        Integer v1 = i < levels1.length ? Integer.parseInt(levels1[i]) : 0;
        Integer v2 = i < levels2.length ? Integer.parseInt(levels2[i]) : 0;
        int compare = v1.compareTo(v2);
        if (compare != 0) {
            return compare;
        }
    }

    return 0;
}

第二条原则是本子号字段列表分隔方式
        epoch 属性之外,version 和 release
大概不单单富含数字,也大概带有字符串,举个例子 1.0阿尔法1、2.0.0+svn12221
        遭逢这种状态时,版本号字段会被分隔为列表。分隔战术是数字与字符串分开,产生自然分隔边界,点号/加号/减号/下划线作为分隔符。1.0alpha1
会分为 [ 1、0、alpha、1 ],2.0.0+svn12221 会分为 [
2、0、0、svn、12221
]。那样子分隔的目标是为了列表相应分段实行相比,相比较的预先级依据列表的下标顺序自然排序,第3个人的优先级最高,前边依次减少。若是多少个列表可正如的支行经过相比较后都等于,那么列表长的比列表短的新,即便列表长度也意气风发致,那么那几个版本号字段相等。
1.2.0 > 1.1.9            ( [1,2,0] 中第2分段的“2” > [1,1,9]
中第2分段的“1” )
1.12.1 > 1.9beta2   ( [1,12,1] 中第2分段的“12” > [1,9,beta,2]
中第2分段的“9” )
3.1.0 > 3.1               ( [3,1,0] 的列表长度3 > [3,1]
的列表长度2 卡塔尔(قطر‎

复杂度
时间 O(N) 空间 O(N)

        最终交给一些例证,应该丰富表达 rpm
包的版本号对比是何等的了。www.350.vip 1
1.00010 > 1.9,因为 10 > 9
2.02 = 2.2,因为 02 = 2
3.4.0 > 3.4,因为 3.4.0 多出叁个列表分段
5mgc25 = 5.mgc.25,因为分隔后的列表两个对等
6.0 > 6beta,因为数字比字符串新

思路:分别对版本号以.分割,按最大尺寸对版本号数组循环,按梯次相比。

发表评论

电子邮件地址不会被公开。 必填项已用*标注