比較

バージョン番号の比較(というかソート)ってどうやってます? ちょっと作ってみたけど…完全ではないなぁ。

これだと文字数で0を足しているだけなので、整数だけとかアルファベットだけならいいけど「9a」(9にパッチが当たった想定)と「10」で、「9a」が後になってしまう。jpegのライブラリとかこういうスタイルだったよな確か。

例えばLinuxみたいに2.6.8-bk1と2.6.8-rc1があってrc1のほうが後だってのはプログラム上はどうするべきなんだろう。Firefoxみたいにrcとprの違いとか。あと、例えば「rc1a1」と「1rc2」みたいなあまり互換性がなさそうなつけ方があったとして、どっちが後とするべきなんだろう。rpmのソースとか見てみようかな。

#! /usr/bin/python

import string

def fix_length(x,y):
    m=max(len(x), len(y))
    x.extend("0"*(m-len(x)))
    y.extend("0"*(m-len(y)))
    return x,y

def fix_length_str(x,y):
    m=max(len(x), len(y))
    return x.zfill(m), y.zfill(m)

# "n.n.n-n.n.n"
def compare_version(x,y,spl=''):
    # split "-"
    # print "cmp0", x,y
    if len(spl)==0:
        # return cmp(string.atoi(x),string.atoi(y))
        x,y=fix_length_str(x,y)
        return cmp(x,y)
    x1, y1=x.split(spl[0]), y.split(spl[0])
    x1, y1=fix_length(x1, y1)
    for i in range(len(x1)):
        r=compare_version(x1[i], y1[i], spl[1:])
        if r!=0:
            return r
    return 0

if __name__=='__main__':
    a=["1.0.0", "0.90", "0.1", "0.9", "0.10", "1.2.5", "1.2.5-10", "1.2-20", "1.2.5-9"]
    a.sort(lambda x,y: compare_version(x,y, "-."))
    print a

結果は以下。

['0.1', '0.9', '0.10', '0.90', '1.0.0', '1.2-20', '1.2.5', '1.2.5-9', '1.2.5-10']

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です