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 に答える