2013-08-11 3 views
7

Я новый программист для клоуре.Clojure получить ключ карты по значению

Учитывая ...

{:foo "bar"} 

Есть ли способ, чтобы получить имя ключа со значением «бар»?

Я просмотрел документы карты и вижу способ получить ключ и значение или просто значение, но не только ключ. Помогите оценить!

+4

Конечно, но это обычно означает, что ваша структура данных с ногами на голове. – delnan

+0

Итак ... http://stackoverflow.com/questions/15595986/swap-keys-and-values-in-a-map? –

+0

Зависит от того, что именно вы делаете (возможно, вместо этого вы можете изменить код, который создает карту, или вам нужны оба направления), но моя догадка была бы такой: Да. – delnan

ответ

18

Может быть несколько пар ключ/значение со значением «бар». Значения не хешируются для поиска, напротив их ключей. В зависимости от того, что вы хотите достичь, вы можете посмотреть ключ с линейным алгоритмом как:

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

Или

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

Или

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

, который будет возвращать SEQ ключей , Если вы знаете, что ваши Vals отличаются друг от друга, вы можете также создать обратный поиск хэш-карту с

(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) 
Смежные вопросы