2013-08-11 12 views
7

Jestem nowym programistą clojure.Clojure uzyskać klucz mapy przez wartość

Biorąc pod uwagę ...

{:foo "bar"} 

Czy istnieje sposób, aby odzyskać nazwę klucza o wartości „bar”?

Przeglądam dokumenty map i widzę sposób na odzyskanie klucza i wartości lub po prostu wartość, ale nie tylko klucz. Pomoc doceniona!

+4

Jasne, ale to zwykle oznacza, że ​​struktura danych jest do góry nogami. – delnan

+0

Więc ... http://stackoverflow.com/questions/15595986/swap-keys-and-values-in-a-map? –

+0

Zależnie od tego, co dokładnie robisz (być może możesz zmienić kod, który tworzy mapę, lub potrzebujesz obu kierunków), ale moje przeczucie byłoby: tak. – delnan

Odpowiedz

18

Istnieje kilka par klucz/wartość o wartości "bar". Wartości nie są mieszane dla wyszukiwania, przeciwnie do ich kluczy. W zależności od tego, co chcesz osiągnąć, można spojrzeć na klucz z liniowego algorytmu jak:

(def hm {:foo "bar"}) 
(keep #(when (= (val %) "bar") 
      (key %)) hm) 

Or

(filter (comp #{"bar"} hm) (keys hm)) 

Albo

(reduce-kv (fn [acc k v] 
      (if (= v "bar") 
       (conj acc k) 
       acc)) 
      #{} hm) 

który zwróci nast kluczy . Jeśli wiesz, że twoi vals różnią się od siebie, można także utworzyć wyszukiwania wstecznego hash-mapy z

(clojure.set/map-invert hm) 
5
user> (->> {:a "bar" :b "foo" :c "bar" :d "baz"} ; initial map 
      (group-by val) ; sorted into a new map based on value of each key 
      (#(get % "bar")) ; extract the entries that had value "bar" 
      (map key))  ; get the keys that had value bar 
(:a :c) 
Powiązane problemy