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

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

问题描述

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

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.

所以我开发了此功能

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'

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

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