我刚刚在探索 groovy 时遇到了这个问题,我有一个 Map,我想从该映射中获取具有相同值的键。
Map maps = ['a': 10, 'b': 10, 'c': 11, 'd': 12]
是否可以只获取具有相同值的键,我想从这个例子中得到一个包含值的列表:
List keys = ['a','b']
我有一个解决这个问题的方法,它是一长串代码,我只是想知道是否可以使用
findAll
来解决这个问题。在 map 中。我很难计算 map 中的值。感谢您分享您的想法。
最佳答案
如果您知道需要 key 用于哪个值,那么您可以使用 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) == []
如果您不知道哪个值应该具有重复的键,而您只想获取具有重复值的键(如果有),您可以尝试以下操作:
def getKeysWithRepeatedValue(map) {
map.groupBy { it.value }.find { it.value.size() > 1 }?.value*.key
}
它首先按值对映射条目进行分组,因此
map.groupBy { it.value }
的结果例如 map 是 [10:[a:10, b:10], 11:[c:11], 12:[d:12]]
.然后它在该映射中找到具有多个元素作为值的列表的第一个条目;该条目对应于具有多个关联键的值。 .find { it.value.size() > 1 }
的结果将是 map 条目 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']
关于list - 在 Groovy 映射中获取具有重复值的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13465794/