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

List 在Groovy映射中获取具有重复值的键,list,groovy,map,key,List,Groovy,Map,Key,我在探索groovy时遇到了这个问题,我有一个映射,我想从该映射中获得具有相同值的键 Map maps = ['a': 10, 'b': 10, 'c': 11, 'd': 12] 是否可以只获取具有相同值的键,我想从这个示例中获得一个具有值的列表: List keys = ['a','b'] 我有一个解决这个问题的方法,这是一个很长的代码行,我只是想知道是否可以使用Map中的findAll来解决这个问题。我很难计算地图上的数值 谢谢分享你的想法。你是说 Map maps = ['a': 1

我在探索groovy时遇到了这个问题,我有一个映射,我想从该映射中获得具有相同值的键

Map maps = ['a': 10, 'b': 10, 'c': 11, 'd': 12]
是否可以只获取具有相同值的键,我想从这个示例中获得一个具有值的列表:

List keys = ['a','b']
我有一个解决这个问题的方法,这是一个很长的代码行,我只是想知道是否可以使用Map中的
findAll
来解决这个问题。我很难计算地图上的数值

谢谢分享你的想法。

你是说

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
   }
}
如果您知道需要键的值,则可以使用
findAll
方法获取所有具有该值的条目,然后使用
keySet
或使用splat操作符作为
*。键

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}
的结果将是映射项
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']

旁注:在您的示例中,您从文本设置映射,在groovy中将其转换为LinkedHashMap,而LinkedHashMap实际上保留了键的顺序。我的观点是,如果您从文字(或LinkedHashMap)以外的其他地方获得映射,则无法预测“…keySet()as List”.hhmmm.的顺序。。我真正想要的是具有重复值的键。在我的例子中。我想返回a和b键,因为它们有相同的值10。哦?那么让我修改一下我的答案。我不太清楚你要什么。在
['a':10,'b':10,'c':11,'d':12,'e':12]
的情况下,您想要回什么?另外,请注意,您的语法是非法的-您的意思是
[[a':10],'b':10],'c':11],'d':12]
,还是下面的无政府主义者所建议的?另外,您是否提前知道要查找的特定值,或者您只是在查找在地图上具有重复值的任何键?哦。我不知道我的语法是非法的,因为它对我有用。谢谢你的信息。我想检索地图上具有重复值的键。在我的示例中,我想得到键a和键b,因为它们有重复的值10。更正:语法只对列表不利。作为一张地图,它现在很好。这是非常有用的,我现在知道它是如何工作的了。谢谢<代码>groupBy正是我所需要的。谢谢