首页 > 解决方案 > groovy 对版本号列表进行排序

问题描述

我有一个版本号列表,例如,

Versions = [0.0.10, 0.0.11, 0.0.13, 0.0.14, 0.0.15, 0.0.16, 0.0.17, 0.0.18, 0.0.19, 0.0.20, 0.0.21, 0.0.22, 0.0.23, 0.0.24, 0.0.25, 0.0.26, 0.0.27, 0.0.28, 0.0.29, 0.0.3, 0.0.30, 0.0.33, 0.0.34, 0.0.35, 0.0.36, 0.0.37, 0.0.38, 0.0.39, 0.0.4, 0.0.41, 0.0.42, 0.0.43, 0.0.44, 0.0.45, 0.0.46, 0.0.47, 0.0.48, 0.0.49, 0.0.5, 0.0.5-delivery.5, 0.0.50, 0.0.51, 0.0.52, 0.0.53, 0.0.54, 0.0.55, 0.0.56, 0.0.57, 0.0.58, 0.0.59, 0.0.6, 0.0.60, 0.0.61, 0.0.62, 0.0.63, 0.0.64, 0.0.7, 0.0.8, 0.0.9]'

而且我需要获取最新版本(0.0.64), Versions.sort() && Collections.max(Versions) 对我不起作用。

所以我开发了这个功能打击

def mostRecentVersion(def versions) {
def  lastversion = "0.0.0"
for (def items : versions) {

    def version = items.tokenize('-')[0]
    def ver = version.tokenize('.')
    def lastver = lastversion.tokenize('.')

    if (lastver[0].toInteger() < ver[0].toInteger() ){
        lastversion = version

    }else if(lastver[0].toInteger() == ver[0].toInteger()) {

        if (lastver[1].toInteger() < ver[1].toInteger() ){
            lastversion = version

        }else if(lastver[1].toInteger() == ver[1].toInteger()){

            if (lastver[2].toInteger() < ver[2].toInteger() ){
                lastversion = version

            }
        }
    }
}
return lastversion }

请问有没有更好的

谢谢你的帮助 :)

标签: groovyversion

解决方案


我相信这会起作用......它还保留了原始版本字符串,以防 0.5.5-devel.5 是最新的......它依赖于 Groovy 将使用 LinkedHashMap 作为排序映射的事实,所以顺序将被保留:-)

def mostRecentVersion(def versions) {
    versions.collectEntries {
        [it, it.split(/\./).collect { (it =~ /([0-9]+).*/)[0][1] }*.toInteger()]
    }.sort { a, b ->
        [a.value, b.value].transpose().findResult { x, y -> x <=> y ?: null } ?:
            a.value.size() <=> b.value.size() ?:
            a.key <=> b.key
    }.keySet()[-1]
}

def fullVersions = ['0.0.10', '0.0.11', '0.0.13', '0.0.14', '0.0.15', '0.0.16', '0.0.17', '0.0.18', '0.0.19', '0.0.20', '0.0.21', '0.0.22', '0.0.23', '0.0.24', '0.0.25', '0.0.26', '0.0.27', '0.0.28', '0.0.29', '0.0.3', '0.0.30', '0.0.33', '0.0.34', '0.0.35', '0.0.36', '0.0.37', '0.0.38', '0.0.39', '0.0.4', '0.0.41', '0.0.42', '0.0.43', '0.0.44', '0.0.45', '0.0.46', '0.0.47', '0.0.48', '0.0.49', '0.0.5', '0.0.5-delivery.5', '0.0.50', '0.0.51', '0.0.52', '0.0.53', '0.0.54', '0.0.55', '0.0.56', '0.0.57', '0.0.58', '0.0.59', '0.0.6', '0.0.60', '0.0.61', '0.0.62', '0.0.63', '0.0.64', '0.0.7', '0.0.8', '0.0.9']

assert mostRecentVersion(fullVersions) == '0.0.64'

assert mostRecentVersion(['0.0.5-delivery.5', '0.0.3', '0.0.5']) == '0.0.5-delivery.5'

assert mostRecentVersion(['0.0.5.5', '0.0.5-delivery.5', '0.0.5']) == '0.0.5.5'

编辑:

进行了更改,以便0.5.5.5>0.5.5-devel.5


推荐阅读