You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Groovy教程:如何对以点分隔数字的字符串数组排序

Groovy实现版本号字符串的自然排序

问题场景

我们有一组存储版本号的Groovy字符串数组:

def arr= [
    "7.11.2",
    "6.2.1",
    "1.4",
    "4.13.5",
    "4.2.5",
    "13",
    "1.2.5",
    "1.4.2",
    "6.15.3",
    "6.4.4"
]

直接调用.sort()方法会按字符串字典序排序(比如"13"会排在最前面,"4.13.5"会比"4.2.5"靠前),这不符合版本号的自然排序逻辑。我们需要得到按点分隔的数字段排序后的结果:

def list = [
    "1.2.5",
    "1.4",
    "1.4.2",
    "4.2.5",
    "4.13.5",
    "6.2.1",
    "6.4.4",
    "6.15.3",
    "7.11.2",
    "13"
]

解决方案

方法1:自定义比较逻辑(兼容所有Groovy版本)

通过给sort()方法传入自定义比较器,把每个版本号拆分成整数列表后逐段对比:

def arr= [
    "7.11.2",
    "6.2.1",
    "1.4",
    "4.13.5",
    "4.2.5",
    "13",
    "1.2.5",
    "1.4.2",
    "6.15.3",
    "6.4.4"
]

def sortedArr = arr.sort { a, b ->
    // 拆分版本号为整数数组
    def aParts = a.split(/\./).collect { it.toInteger() }
    def bParts = b.split(/\./).collect { it.toInteger() }
    
    // 逐段比较数字
    int minLen = Math.min(aParts.size(), bParts.size())
    for (int i = 0; i < minLen; i++) {
        int compareResult = aParts[i] <=> bParts[i]
        if (compareResult != 0) {
            return compareResult
        }
    }
    // 前面段都相同的话,段数少的版本排在前面(比如"1.4" < "1.4.2")
    return aParts.size() <=> bParts.size()
}

// 输出验证结果
println sortedArr

方法2:用Groovy内置的VersionNumber类(Groovy 2.5+)

如果你的Groovy版本在2.5及以上,可以直接用groovy.util.VersionNumber工具类,它已经封装了版本号的解析和比较逻辑:

import groovy.util.VersionNumber

def arr= [
    "7.11.2",
    "6.2.1",
    "1.4",
    "4.13.5",
    "4.2.5",
    "13",
    "1.2.5",
    "1.4.2",
    "6.15.3",
    "6.4.4"
]

def sortedArr = arr.sort { VersionNumber.parse(it) }

println sortedArr

这个方法代码更简洁,VersionNumber.parse()会自动处理版本号的分段对比,包括不同长度的版本号排序。

内容的提问来源于stack exchange,提问作者Ivan Tovbin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 09:55:15