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"]

Спасибо!

Ответ 1

Для сортировки с учетом регистров используйте

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

Ответ 2

Предполагая, что вы хотите сортировать по значению, вы можете просто сделать:

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

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

Ответ 3

Кстати, вот код, который показывает разную сортировку с и без 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

И wll print:

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

Ответ 4

Если кто-то ищет, как выполнить работу в сценарии конвейера Jenkins, вам придется создать отдельный метод с аннотацией @NonCPS для этого:

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

А затем вызовите его из сценария конвейера.

def sortedMapZoneMap = getSorted(mapZonesMap)

Вы можете, конечно, применить "чувствительную к регистру" логику сверху.