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

时间:2012-11-20 02:35:51

标签: list groovy map key

我在探索groovy时遇到了这个问题,我有一张地图,我想从该地图获取具有相同值的键。

Map maps = ['a': 10, 'b': 10, 'c': 11, 'd': 12]

是否可以仅获取具有相同值的键,我想从此示例获得的是具有值的列表:

List keys = ['a','b']

我有一个解决这个问题的方法,这是一长串代码,我只是想知道是否可以使用Map中的findAll来解决这个问题。我在计算地图中的值时很难。

感谢您分享您的想法。

2 个答案:

答案 0 :(得分:7)

如果您知道您需要密钥的值,那么您可以使用findAll方法获取具有该值的所有条目,然后使用{{1获取密钥或者使用splat运算符作为keySet

*.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 }。然后它找到该映射中的第一个条目,该条目具有包含多个元素的列表作为值;该条目对应于具有多个与之关联的键的值。 [10:[a:10, b:10], 11:[c:11], 12:[d:12]]的结果是地图条目.find { it.value.size() > 1 }。最后一个条件导航和splat运算符10={a=10, b=10}是获取该条目的值,以防它存在,然后获取该值的键。用法:

?.value*.key

答案 1 :(得分:3)

你的意思是

Map maps = ['a': 10, 'b': 10, 'c': 11, 'd': 12]

也许?很容易,但地图不保留元素的顺序。您可以使用以下命令检索没有特定顺序的键列表:

List output = maps.keySet() as List

或者,如果您想要反转地图,并找到每个值的键列表,您可以使用:

Map output = maps.groupEntriesBy {
   it.value
}.each {
   it.value = it.value.collect {
      it.key
   }
}