ant*_*bry 3 groovy key list map
我在探索groovy时想出了这个问题,我有一个Map,我想从该地图获取具有相同值的键.
Map maps = ['a': 10, 'b': 10, 'c': 11, 'd': 12]
Run Code Online (Sandbox Code Playgroud)
是否有可能只获得具有相同值的键,我想从这个例子得到的是一个带有值的列表:
List keys = ['a','b']
Run Code Online (Sandbox Code Playgroud)
我有一个解决这个问题的方法,这是一长串代码,我只是想知道是否可以findAll在Map中解决这个问题.我很难计算地图中的值.
感谢您分享您的想法.
如果您知道需要哪个值,那么您可以使用该findAll方法获取具有该值的所有条目,然后使用keySet或使用splat运算符获取键*.key:
def keysForValue(map, value) {
map.findAll { it.value == value }*.key
}
def map = ['a': 10, 'b': 10, 'c': 11, 'd': 12]
assert keysForValue(map, 10) == ['a', 'b']
assert keysForValue(map, 12) == ['d']
assert keysForValue(map, 13) == []
Run Code Online (Sandbox Code Playgroud)
如果您不知道哪个值应该包含重复键,并且您想要的只是获取具有重复值的键(如果有的话),您可以尝试以下方法:
def getKeysWithRepeatedValue(map) {
map.groupBy { it.value }.find { it.value.size() > 1 }?.value*.key
}
Run Code Online (Sandbox Code Playgroud)
它首先按值对映射条目进行分组,因此map.groupBy { it.value }示例映射的结果为[10:[a:10, b:10], 11:[c:11], 12:[d:12]].然后它找到该映射中的第一个条目,该条目具有包含多个元素的列表作为值; 该条目对应于具有多个与之关联的键的值.结果.find { it.value.size() > 1 }将是地图条目10={a=10, b=10}.最后一个条件导航和splat运算符?.value*.key是获取该条目的值,以防它存在,然后获取该值的键.用法:
assert getKeysWithRepeatedValue(['a': 10, 'b': 10, 'c': 11, 'd': 12]) == ['a', 'b']
// If no value has more than one key, returns null:
assert getKeysWithRepeatedValue(['a': 10, 'c': 11, 'd': 12]) == null
// If more than one value has repeated keys, returns the keys that appear first:
assert getKeysWithRepeatedValue(['a': 10, 'b': 11, 'c': 10, 'd': 11]) == ['a', 'c']
Run Code Online (Sandbox Code Playgroud)
你的意思是
Map maps = ['a': 10, 'b': 10, 'c': 11, 'd': 12]
Run Code Online (Sandbox Code Playgroud)
也许?足够容易,但是地图不会保留元素的顺序。您可以按以下任意顺序检索键列表:
List output = maps.keySet() as List
Run Code Online (Sandbox Code Playgroud)
或者,如果您想反向映射,并找到每个值的键列表,则可以使用以下方法:
Map output = maps.groupEntriesBy {
it.value
}.each {
it.value = it.value.collect {
it.key
}
}
Run Code Online (Sandbox Code Playgroud)