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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:15:40