2012-04-12 13 views
5

Estoy tratando de ordenar un mapa en Groovy que tiene mapas como valor. Quiero iterar sobre el mapa e imprimir los valores ordenados por los valores de lastName y firstName. Así, en el siguiente ejemplo:Ordenando mapas dentro de los mapas por valor

def m = 
[1:[firstName:'John', lastName:'Smith', email:'[email protected]'], 
2:[firstName:'Amy', lastName:'Madigan', email:'[email protected]'], 
3:[firstName:'Lucy', lastName:'B',  email:'[email protected]'], 
4:[firstName:'Ella', lastName:'B',  email:'e[email protected]'], 
5:[firstName:'Pete', lastName:'Dog', email:'[email protected]']] 

los resultados deseados serían: m.sort

[firstName:'Ella', lastName:'B',  email:'[email protected]'] 
[firstName:'Lucy', lastName:'B',  email:'[email protected]'] 
[firstName:'Pete', lastName:'Dog', email:'[email protected]'] 
[firstName:'Amy', lastName:'Madigan', email:'[email protected]'] 
[firstName:'John', lastName:'Smith', email:'[email protected]'] 

He intentado {it.value.lastName & & it.value.firstName} y m. ordenar {[it.value.lastName, it.value.firstName]}. La ordenación por m.sort {it.value.lastName} funciona pero no se ordena por firstName.

¿Alguien puede ayudar con esto, muy apreciado, gracias!

+0

Creo que esto es un duplicado de [esta otra pregunta] (http://stackoverflow.com/q/9559309/581845). ¿Podríamos marcarlos como duplicados y quizás fusionarlos bajo un título más general y descriptivo? – epidemian

Respuesta

4

Esto debe hacerlo:

m.values().sort { a, b -> 
    a.lastName <=> b.lastName ?: a.firstName <=> b.firstName 
} 
+0

Perfecto, gracias. ¡Trabajó como un campeón! –