在clojure中两个地图之间的交集

时间:2014-12-26 18:52:12

标签: clojure functional-programming

我有哈希地图,我试图获得密钥之间的交集。但功能“交叉”'只需使用套装。

所以我获得了密钥,将密钥转换为集合,然后调用交叉点,如下所示:

(intersection (set (keys map-1)) (set (keys map-2)))

有更好的方法吗?

由于

3 个答案:

答案 0 :(得分:7)

这可能是最简单/最简洁的方法,并且它不需要构建任何集合(相对昂贵)。

(keys (select-keys map-1 (keys map-2)))

最后,一个优化版本,速度更快,更难阅读:

(keep #(some->> % (find map-1) key) (keys map-2))

答案 1 :(得分:2)

您的解决方案简洁明了。

如果需要考虑性能,可以通过模仿clojure.set/intersection的结构避免构建中间集:

(defn key-intersection [s1 s2]
  (if (< (count s2) (count s1))
    (recur s2 s1)
    (reduce
     (fn [result item]
       (if (contains? s2 item)
         (conj result item)
         result))
     #{}
     (keys s1))))

答案 2 :(得分:1)

以下内容适用于任意数量的地图

(defn key-intersection [m & ms]
  (reduce #(keys (select-keys %2 %1)) (keys m) ms))

(defn key-intersection [m & ms]
  (reduce (fn [v c] (keep #(some->> % (find c) key) v)) (keys m) ms))