2012-12-26 13 views

Odpowiedz

1

Najprawdopodobniej będziesz musiał powtórzyć numer entry set i spróbować znaleźć wpis z pasującym value.

12

Nie wiem, czy istnieje bezpośredni sposób, aby uzyskać klucz dla danej wartości, ale przy użyciu Map#find uzyskać wpis mapie, a następnie uzyskać jej wartość powinna być na tyle:

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 

Ogólnie mapy nie muszą mieć relacji zleceń między ich wpisami, ale domyślną implementacją dla map dosłownych Groovy jest LinkedHashMap, który jest zamówiony na, więc zawsze przyniesie pierwszy klucz wartości podczas korzystania z tych map.

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] 
5

Nie ma konkretnego polecenia.

Na szczęście, jak pokazał here, można łatwo dostać klucz (-ów) dla określonej wartości w mapie:

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

można zrobić:

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

Jeśli chcesz wszystko klucze, zrobić coś takiego:

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'] 
2

można odwrócić mapę, na przykład:

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' 
+0

Nie, Twój kod jest interesujący :), ale zabójca wydajności, ponieważ odtwarzasz inną mapę. Istnieje metoda, aby znaleźć wpis na mapie, biorąc pod uwagę jego wartość, odpowiednia odpowiedź została podana przez epidemię dawno temu: myMap.find {it.value == 5} .key – ARA

+0

@ARA w rzeczywistości do wielokrotnego użytku rozwiązanie crazy4groovy będzie szybsze tak długo, jak odwrócona kolekcja nie jest odtwarzana za każdym razem. Nie powinieneś iterować nad listą O (n), kiedy możesz użyć mapy w O (logN). Oczywiście wydajność powinna i tak zająć miejsce do czytania - i jeśli zrobi się to dobrze, rozwiązanie crazy4groovy jest prawdopodobnie bardziej czytelne ... Jednak to nie jest strasznie "Groovy" :) –

+0

@Bill: Tak, powiedziałem Zabójcą wydajności jest odtworzenie mapy za każdym razem, tak jak w przykładzie, który używa lambdy do odtworzenia jej w locie. Oczywiście, jeśli mapa nie zostanie odtworzona przy każdym połączeniu i utrzymywana, będzie to o wiele szybsze niż wykonywanie iteracji. Taki jest cel mapy. :) I myślę, że mapa jest określana jako O (1) nie O (log (n)), a btree będzie O (log (n))? – ARA

Powiązane problemy