こんにちは、私はこのような地図を持っています:
[this:0, is:1, a:2, file:3, anotherkey:4, aa:5]
key
マップの指定されたを見つけられたらいいのにと思いvalue
ます。たとえば、値が指定されている場合、マップ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
これらのマップを使用すると、常に値の最初のキーが生成されます。
そのための特定のコマンドはありません。
幸いなことに、ここに示すように、マップ内の特定の値のキーを簡単に取得できます。
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]