【发布时间】:2012-12-26 18:30:28
【问题描述】:
您好,我有一张这样的地图:
[this:0, is:1, a:2, file:3, anotherkey:4, aa:5]
如果给定地图的value,我希望能找到key。例如,如果给定值5,我需要从地图中返回aa。
这可能吗?
【问题讨论】:
您好,我有一张这样的地图:
[this:0, is:1, a:2, file:3, anotherkey:4, aa:5]
如果给定地图的value,我希望能找到key。例如,如果给定值5,我需要从地图中返回aa。
这可能吗?
【问题讨论】:
我不知道是否有直接的方法来获取给定值的键,但是使用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 总是会产生使用这些映射时值的第一个键。
【讨论】:
没有具体的命令。
幸运的是,如 here 所示,您可以轻松获取映射中特定值的键:
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']
【讨论】:
你可以像这样反转地图:
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'
【讨论】:
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]
【讨论】: