Clojure按值获取地图键

时间:2013-08-11 20:30:26

标签: clojure

我是一名新的clojure程序员。

...鉴于

{:foo "bar"}

有没有办法检索带有“bar”值的密钥名称?

我查看了地图文档,可以看到一种方法来检索键和值,或仅仅是值,而不仅仅是键。帮助赞赏!

3 个答案:

答案 0 :(得分:21)

可以有多个键值/值对,其值为“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)

将返回一系列键。如果您知道您的val彼此不同,您还可以使用

创建反向查找哈希映射
(clojure.set/map-invert hm)

答案 1 :(得分:6)

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)

答案 2 :(得分:0)

在许多其他情况下,您可以用于:

(def hm {:foo "bar"})
(for [[k v] hm :when (= v "bar")] k)