2013-08-11 1 views
7

저는 새로운 clojure 프로그래머입니다.Clojure 값으로지도 키 가져 오기

감안할 때

...

{:foo "bar"} 

는 값 "바"와 키의 이름을 검색 할 수있는 방법이 있습니까?

지도를 살펴본 결과 키와 값 또는 값만 검색하는 방법을 볼 수 있지만 키는 검색 할 수 없습니다. 도움말 감사!

+4

물론 함께 역방향 조회 해시 맵을 만들 수 있지만, 일반적으로 데이터 구조가 거꾸로 의미합니다. – delnan

+0

그래서 ... http://stackoverflow.com/questions/15595986/swap-keys-and-values-in-a-map? –

+0

정확히 무엇을하고 있는지에 따라 달라집니다 (지도를 만드는 코드를 변경하거나 양방향이 필요할 수 있음).하지만 직감은 다음과 같습니다. 예. – delnan

답변

18

값이 "bar"인 키/값 쌍이 여러 개있을 수 있습니다. 값은 조회와 달리 키와는 달리 해시되지 않습니다. 키의 배열을 반환합니다

(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) 

: 당신이 달성하려는 작업에 따라 같은 선형 알고리즘과 키를 찾아 볼 수 있습니다 . 당신이 당신의 애송이들이다가 서로 별개 알고 있다면, 당신은 또한

(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)