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

Groovy如何对比major.minor.patch与major.minor格式的版本号

Groovy 不同段数版本号对比解决方案

原有代码的核心缺陷有两个:

  • 仅对比两个版本号共同长度的分段,共同段对比完未分出胜负时没有后续判断逻辑
  • 仅判断了numA > numB的分支,缺少相等、小于的分支处理,无法覆盖全场景

实现思路

通用版本号对比规则默认短版本号缺少的分段为0,因此可以按照以下逻辑实现:

  1. 将两个版本号按.拆分后转为整数列表
  2. 对较短的列表末尾补0,直到两个列表长度一致
  3. 从左到右逐位对比,某一位出现大小差异时直接返回结果,所有位都相等则返回版本相等

完整实现代码

/**
 * 版本号对比函数
 * @param verA 第一个版本号字符串
 * @param verB 第二个版本号字符串
 * @return 1: verA > verB; -1: verA < verB; 0: 两者相等
 */
int compareVersion(String verA, String verB) {
    // 拆分版本号为整数列表
    List<Integer> verAList = verA.tokenize('.')*.toInteger()
    List<Integer> verBList = verB.tokenize('.')*.toInteger()
    
    // 对齐两个列表的长度,短列表末尾补0
    def maxLength = Math.max(verAList.size(), verBList.size())
    while (verAList.size() < maxLength) {
        verAList << 0
    }
    while (verBList.size() < maxLength) {
        verBList << 0
    }
    
    // 逐位对比
    for (int i = 0; i < maxLength; i++) {
        if (verAList[i] > verBList[i]) {
            return 1
        } else if (verAList[i] < verBList[i]) {
            return -1
        }
    }
    return 0
}

// 调用示例(兼容Jenkins Pipeline的echo语法)
def verA = "1.9.1"
def verB = "1.12"
def compareResult = compareVersion(verA, verB)

if (compareResult > 0) {
    echo "$verA is greater than $verB"
} else if (compareResult < 0) {
    echo "$verA is less than $verB"
} else {
    echo "$verA is equal to $verB"
}

验证效果

  • 测试用例1:verA=1.9.1、verB=1.12,返回结果为-1,输出1.9.1 is less than 1.12,符合预期
  • 测试用例2:verA=1.12、verB=1.11,返回结果为1,输出1.12 is greater than 1.11,原有正常场景不受影响
  • 测试用例3:verA=2.0、verB=2.0.0,返回结果为0,输出两者相等,符合通用版本号规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:06:06