我有哈希地图,我试图获得密钥之间的交集。但功能“交叉”'只需使用套装。
所以我获得了密钥,将密钥转换为集合,然后调用交叉点,如下所示:
(intersection (set (keys map-1)) (set (keys map-2)))
有更好的方法吗?
由于
答案 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))