12

嗨,我有一张这样的地图:

[this:0, is:1, a:2, file:3, anotherkey:4, aa:5]

我希望我能找到key给定的value地图。例如,如果5给出了值,我需要aa从地图返回。

那可能吗?

4

5 回答 5

19

我不知道是否有直接的方法来获取给定值的键,但是使用Map#find来获取地图条目然后获取它的值就足够了:

def keyForValue(map, value) {
    map.find { it.value == value }?.key
}

def map = [a: 1, b: 2, c: 3]
assert keyForValue(map, 2) == 'b'
assert keyForValue(map, 42) == null

一般来说,映射不需要在它们的条目之间有顺序关系,但是 Groovy 的文字映射的默认实现是 LinkedHashMap,它有序的,因此keyForValue在使用这些映射时总是会产生值的第一个键。

于 2012-12-26T19:02:18.150 回答
8

没有具体的命令。

幸运的是,如此处所示您可以轻松获取映射中特定值的键:

def myMap = [this:0, is:1, a:2, file:3, fix:4, aa:5]
def myValue = 5

你可以做:

def myKey = myMap.find{ it.value == myValue }?.key
// 'aa'

如果您想要所有密钥,请执行以下操作:

def myMap = [this:0, is:1, a:2, file:3, fix:4, aa:5, bb:5]
def myValue = 5

def myKeys = []
myMap.findAll{ it.value == myValue }.each{myKeys << it?.key}
// ['aa', 'bb']
于 2012-12-28T12:58:50.703 回答
3

您可以反转地图,如下所示:

Map m = [a: '1', b: '2']
Map mInvert = m.collectEntries { e -> [(e.value): e.key] }

assert mInvert == ['1':'a', '2':'b']

assert mInvert['2'] == 'b'
assert m['b'] == '2'
于 2016-08-03T15:19:58.567 回答
1

您可能必须自己遍历条目集并尝试找到具有匹配的条目。

于 2012-12-26T18:37:48.153 回答
1
def expect = 5
def m = ['this':0, is:1, a:2, file:3,  aa:5]
def r = m.collectMany{ k,v -> (v == expect) ? [k] : []}

// Result: [aa]
于 2012-12-27T07:23:39.287 回答