list - 在 Groovy 映射中获取具有重复值的键

标签 list groovy map key

我刚刚在探索 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/

相关文章:

sorting - groovy中的列表排序

java - 将输入扫描到字符数组Java

c - 查找链表一个节点的字符串长度

Grails 错误 - 删除的对象将被重新保存

grails - Griffon Gsql-如何在Config.properties文件中配置数据源?

spring - 实用程序 :map in Spring picking up every bean of the map type

c++ - 如何使用 STL 算法和仿函数按值删除 std::map 单元格?

java - 在 Mollweide 投影中获取我的世界地图中某个点的经度纬度

python - 对彼此链接的 2 个列表进行排序

java - 列出和链接文件