Groovy中如何在for循环中按指定版本区间迭代列表并正确比较版本号
存在的问题
- 判断条件逻辑错误
你写的判断条件B >= item && A <= item实际含义是「当前版本item小于等于起始版本B,同时大于等于目标版本A」,完全和你要的「从B开始到A结束的所有版本」需求相反,所以首先就会过滤掉大部分符合要求的版本。 - 直接字符串比较版本号不成立
字符串比较是逐位按ASCII码值对比,比如版本1.10.0和1.7对比时,第二位字符1的ASCII码小于7,会得到"1.10.0" < "1.7"的错误结果,和实际版本号大小规则完全不符,就算你改对判断条件也拿不到正确结果。
修复后的代码
def C = ['1.0', '1.6', '1.7', '1.7.1', '1.10.0', '1.11.0', '1.12'] def A = '1.12' def B = '1.7' // 实现符合语义的版本号比较方法 def compareVer(String ver1, String ver2) { def v1Parts = ver1.split(/\./).collect { it.toInteger() } def v2Parts = ver2.split(/\./).collect { it.toInteger() } def len = Math.max(v1Parts.size(), v2Parts.size()) for (int i = 0; i < len; i++) { def p1 = i < v1Parts.size() ? v1Parts[i] : 0 def p2 = i < v2Parts.size() ? v2Parts[i] : 0 if (p1 != p2) { return p1 <=> p2 } } return 0 } for (item in C) { // 修正判断逻辑:item >= B 且 item <= A if (compareVer(item, B) >= 0 && compareVer(item, A) <= 0) { println "deploy the version ${item}" } }
运行上述代码即可得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者user2995458
相关产品推荐
相关产品推荐

