Groovy中自定义比较器对Map按日期值排序(Jenkins Pipeline场景)
按日期值对Jenkins Pipeline中的Map排序问题
问题背景
现有包含日期值的Map:
final_map = ["/7amd64-Aug2022.1":"2022-08-09","/7amd64-Oct2022.1":"2022-10-12","/7":"2022-11-08","/7amd64-Jul2022.1":"2022-07-12","/7amd64":"2022-11-08","/7amd64-June2022.1":"2022-06-14","/7amd64-beta":"2022-11-08","/7amd64-Sep2022.1":"2022-09-14","/7amd64-Nov2022.1":"2022-11-08","/_uploads":"2022-11-08"]
尝试用以下代码按日期值排序,但无法正常工作:
result = final_map.sort { a,b -> a.value <=> b.value } echo "Output: ${result}"
期望实现按Map中的日期值完成排序。
问题原因
Groovy中Map.sort()方法默认返回的是包含Map.Entry对象的列表,而非有序的Map实例。直接输出这个列表会不符合预期的Map格式,且无法保留有序的键值对结构。
另外,虽然当前日期采用YYYY-MM-DD的ISO格式,字符串直接比较的结果和日期逻辑排序一致,但如果后续日期格式变化,显式转换为日期对象再比较能避免排序错误。
解决方案
方案1:用collectEntries转换为有序Map
collectEntries方法可以将排序后的Entry列表转换为LinkedHashMap(保留插入顺序):
def sortedMap = final_map.sort { a, b -> a.value <=> b.value }.collectEntries() echo "Output: ${sortedMap}"
方案2:显式构建LinkedHashMap
手动遍历排序后的Entry列表,将键值对存入LinkedHashMap(有序Map实现):
def sortedMap = new LinkedHashMap() // 按日期值排序Entry列表 final_map.sort { a, b -> a.value <=> b.value }.each { entry -> sortedMap[entry.key] = entry.value } echo "Output: ${sortedMap}"
可选:显式转换日期对象比较(兼容非ISO格式)
如果后续日期格式可能变化,建议将字符串转为Date对象后再比较,确保排序逻辑准确:
def dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd") def sortedMap = final_map.sort { a, b -> dateFormat.parse(a.value) <=> dateFormat.parse(b.value) }.collectEntries() echo "Output: ${sortedMap}"
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

