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

如何对Groovy Map按value的size()进行降序排序?

解决Groovy中Map按Value集合大小降序排序的问题

你的思路其实完全没问题,只是需要注意Groovy里sort()方法的一个小细节:它默认返回的是排序后的Entry列表,而非保留顺序的Map。如果想要得到你期望的Map结构,只需要把排序结果转换成LinkedHashMap(普通HashMap不保证顺序)就行。

完整实现代码

def firstString = "first"
def secondString = "second"
def thirdString = "third"

def source = [(firstString): [3, 2, 1], (secondString): [3, 2, 1, 4], (thirdString): [3]]

// 按value的size降序排序,转换为LinkedHashMap保留顺序
def sortedSource = source.sort { -it.value.size() } as LinkedHashMap

println sortedSource
// 输出结果: [second:[3, 2, 1, 4], first:[3, 2, 1], third:[3]]

细节说明

  • 你的排序闭包{ -it.value.size() }是正确的:通过对value的size取负数,把默认的升序排序反转成了降序。如果你觉得取负数不够直观,也可以用比较器的写法,效果完全一致:
    def sortedSource = source.sort { a, b -> b.value.size() <=> a.value.size() } as LinkedHashMap
    
  • 必须转成LinkedHashMap的原因:Groovy的sort()返回的是List<Map.Entry>类型的列表,只有转成LinkedHashMap,才能既保持排序后的顺序,又拥有Map的操作特性。如果只是需要遍历排序后的条目,直接用排序后的列表就行,但如果要继续以Map形式使用,转换是必须的。

验证结果

运行上述代码后,输出完全符合你的期望:

[second:[3, 2, 1, 4], first:[3, 2, 1], third:[3]]

内容的提问来源于stack exchange,提问作者Luiz Gonçalves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:20:25