Groovy按值自定义地图排序

Adr*_* Be 13 sorting groovy map

我有一张地图如

m=[
     "james":"silly boy",
     "janny":"Crazy girl",
     "jimmy":"funny man",
     "georges":"massive fella"
];
Run Code Online (Sandbox Code Playgroud)

我希望按其值排序此映射但忽略大小写(这就是为什么需要自定义排序).因此我想我必须使用闭包实现自定义排序.但我是Groovy的新手,并且一直在努力完成这个非常简单的任务!

期望的结果将是:

["janny":"Crazy girl", "jimmy":"funny man", "georges":"massive fella", "james":"silly boy"]
Run Code Online (Sandbox Code Playgroud)

谢谢 !

doe*_*eri 34

要使用不区分大小写进行排序,请使用

m.sort { it.value.toLowerCase() }
Run Code Online (Sandbox Code Playgroud)


tim*_*tes 9

假设您想要对值进行排序,您可以这样做:

Map m =[ james  :"silly boy",
         janny  :"Crazy girl",
         jimmy  :"funny man",
         georges:"massive fella" ]

Map sorted = m.sort { a, b -> a.value <=> b.value }
Run Code Online (Sandbox Code Playgroud)

  • 也相当于`m.sort {it.value}` (4认同)
  • m.sort { a, b -&gt; a.value.toLowerCase() &lt;=&gt; b.value.toLowerCase() } 是其他解决方案的正确答案:) (2认同)

And*_*y E 7

如果有人正在寻找如何使其在 Jenkins 管道脚本中工作,您将必须为此创建一个带有@NonCPS注释的单独方法:

@NonCPS
def getSorted(def mapSizeMap){
    mapSizeMap.sort(){ a, b -> b.value <=> a.value }
}
Run Code Online (Sandbox Code Playgroud)

然后从管道脚本中调用它。

def sortedMapZoneMap = getSorted(mapZonesMap)

您当然可以在顶部应用“区分大小写”的逻辑。


小智 5

顺便说一句,这是显示使用和不使用 toLowerCase() 的不同排序的代码:

Map m =[ james  :"silly boy",
         janny  :"crazy girl",
         jimmy  :"Funny man",
         georges:"massive fella" ]
Map sorted = m.sort { a, b -> a.value <=> b.value }
println sorted
sorted = m.sort { a, b -> a.value.toLowerCase() <=> b.value.toLowerCase() }
println sorted
Run Code Online (Sandbox Code Playgroud)

并将打印:

[jimmy:Funny man, janny:crazy girl, georges:massive fella, james:silly boy]
[janny:crazy girl, jimmy:Funny man, georges:massive fella, james:silly boy]
Run Code Online (Sandbox Code Playgroud)