排序版本号列表groovy [英] Sort list of version numbers groovy

查看:26
本文介绍了排序版本号列表groovy的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a list of version numbers like,

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) 对我不起作用.

And i need to get the last version (0.0.64), Versions.sort() && Collections.max(Versions) doesn't work for me.

所以我开发了这个功能吹

So I developed this function blow

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 }

我在问有没有更好的东西,

i'm asking if there is something better,

谢谢你的帮助:)

推荐答案

想法:

使用可排序的键和原始版本值构建映射,然后按键对映射进行排序,然后只获取值

build map with sortable key and original version value, then sort map by keys, then get only values

为每个值创建可排序的键

to create sortable key for each value

  1. 将版本拆分为数字和非数字字符串数组
  2. 在每个部分 0 前面加上最小长度 3(假设每个数字不超过 3 位数字)
  3. 将数组连接到字符串

所以,对于 0.11.222-dev ->

1. [   '0',   '.',  '11', '222', '-dev' ]
2. [ '000', '00.', '011', '222', '-dev' ]
3. '00000.011222-dev'

代码

def mostRecentVersion(versions){
    return versions.collectEntries{ 
        [(it=~/d+|D+/).findAll().collect{it.padLeft(3,'0')}.join(),it]
    }.sort().values()[-1]
}
//test cases:
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'

这篇关于排序版本号列表groovy的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆