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
相关产品推荐
相关产品推荐

