按值对地图内的地图进行排序

Joh*_*ley 5 sorting groovy map

我正在尝试在Groovy中对映射作为值进行排序.我想迭代地图并打印出由lastName和firstName值排序的值.所以在下面的例子中:

def m = 
[1:[firstName:'John', lastName:'Smith', email:'john@john.com'], 
2:[firstName:'Amy',  lastName:'Madigan', email:'amy@amy.com'], 
3:[firstName:'Lucy', lastName:'B',      email:'lucy@lucy.com'], 
4:[firstName:'Ella', lastName:'B',      email:'ella@ella.com'], 
5:[firstName:'Pete', lastName:'Dog',    email:'pete@dog.com']]
Run Code Online (Sandbox Code Playgroud)

期望的结果将是:

[firstName:'Ella', lastName:'B',      email:'ella@ella.com']
[firstName:'Lucy', lastName:'B',      email:'lucy@lucy.com']
[firstName:'Pete', lastName:'Dog',    email:'pete@dog.com']
[firstName:'Amy',  lastName:'Madigan', email:'amy@amy.com']
[firstName:'John', lastName:'Smith', email:'john@john.com']
Run Code Online (Sandbox Code Playgroud)

我已经尝试了m.sort {it.value.lastName && it.value.firstName}和m.sort {[it.value.lastName,it.value.firstName]}.按m.sort {it.value.lastName}排序有效,但不按firstName排序.

能有人帮忙,非常感谢,谢谢!

tim*_*tes 4

这应该可以做到:

m.values().sort { a, b ->
  a.lastName <=> b.lastName ?: a.firstName <=> b.firstName
}
Run Code Online (Sandbox Code Playgroud)