web-dev-qa-db-ja.com

Groovyはマップを値でカスタムソートします

私は次のような地図を持っています

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

このマップを値で並べ替えたいのですが、大文字と小文字を区別しない(これがカスタム並べ替えが必要な理由です)。したがって、クロージャを使用してカスタムソートを実装する必要があると考えました。しかし、私はGroovyを初めて使用し、この非常に単純なタスクを実行するのに苦労しています。

望ましい結果は次のとおりです。

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

ありがとう!

15
Adrien Be

大文字と小文字を区別せずに並べ替えるには、

m.sort { it.value.toLowerCase() }
33
doelleri

値でソートすることを意味すると仮定すると、次のことができます。

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

Map sorted = m.sort { a, b -> a.value <=> b.value }
9
tim_yates

ところで、これは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

そして、印刷します:

[jimmy:Funny man, janny:crazy girl, georges:massive fella, james:silly boy]
[janny:crazy girl, jimmy:Funny man, georges:massive fella, james:silly boy]
2
Tuomas

誰かがJenkinsパイプラインスクリプトで作業を行う方法を探している場合は、そのための_@NonCPS_アノテーションを使用して別のメソッドを作成する必要があります。

_@NonCPS
def getSorted(def mapSizeMap){
    mapSizeMap.sort(){ a, b -> b.value <=> a.value }
}
_

そして、パイプラインスクリプトからそれを呼び出します。

def sortedMapZoneMap = getSorted(mapZonesMap)

もちろん、「大文字と小文字を区別する」ロジックを上に適用することもできます。

2
Andrey E