如何对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
相关产品推荐
相关产品推荐

