キーが必要な値がわかっている場合は、findAll
メソッドを使用してその値を持つすべてのエントリを取得keySet
し、splat 演算子を使用して、または as を使用してキーを取得でき*.key
ます。
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}
。最後の条件付きナビゲーションとスプラット演算子?.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']