在Groovy中对Map的值进行排序

mon*_*nda 2 groovy

我有一个地图,其中一个键包含多个值

datamap = [ 'Antenna Software':[ 'Salarpuria', 'Cessna', 'Vrindavan Tech', 'Alpha Center' ],
             'Ellucian':[ 'Malvern', 'Ellucian House', 'Residency Road'] ] 
Run Code Online (Sandbox Code Playgroud)

在这里,我需要按字母顺序对值进行排序

datamap = [ 'Antenna Software':[ 'Alpha Center', 'Cessna', 'Salarpuria', 'Vrindavan Tech' ],
            'Ellucian':[ 'Ellucian House', 'Malvern', 'Residency Road' ] ] 
Run Code Online (Sandbox Code Playgroud)

如何以时髦的方式做到这一点?

tim*_*tes 8

你应该能够做到:

def sortedMap = datamap.sort().collectEntries { k, v ->
  [ k, v.sort( false ) ]
}
Run Code Online (Sandbox Code Playgroud)

如果你不打算排序地图的键,你可以摆脱最初的sort():

def sortedMap = datamap.collectEntries { k, v ->
  [ k, v.sort( false ) ]
}
Run Code Online (Sandbox Code Playgroud)

说明sort( false ):

默认情况下,sortGroovy中的方法更改原始列表,因此:

// Given a List
def a = [ 3, 1, 2 ]

// We can sort it
def b = a.sort()

// And the result is sorted
assert b == [ 1, 2, 3 ]

// BUT the original list has changed too!
assert a != [ 3, 1, 2 ] && a == [ 1, 2, 3 ]
Run Code Online (Sandbox Code Playgroud)

因此,如果您传递falsesort它,它将单独保留原始列表,并返回已排序的列表:

// Given a List
def a = [ 3, 1, 2 ]

// We can sort it (passing false)
def b = a.sort( false )

// And the result is sorted
assert b == [ 1, 2, 3 ]

// AND the original list has remained the same
assert a == [ 3, 1, 2 ]
Run Code Online (Sandbox Code Playgroud)