Groovy如何对比major.minor.patch与major.minor格式的版本号
Groovy 不同段数版本号对比解决方案
原有代码的核心缺陷有两个:
- 仅对比两个版本号共同长度的分段,共同段对比完未分出胜负时没有后续判断逻辑
- 仅判断了
numA > numB的分支,缺少相等、小于的分支处理,无法覆盖全场景
实现思路
通用版本号对比规则默认短版本号缺少的分段为0,因此可以按照以下逻辑实现:
- 将两个版本号按
.拆分后转为整数列表 - 对较短的列表末尾补0,直到两个列表长度一致
- 从左到右逐位对比,某一位出现大小差异时直接返回结果,所有位都相等则返回版本相等
完整实现代码
/** * 版本号对比函数 * @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
相关产品推荐
相关产品推荐

