Clojure如何仅合并两个哈希映射中共同存在的键?
在Clojure中合并两个哈希映射并仅保留共同键
嘿,刚接触Clojure的话确实会对这些集合操作有点懵,不过这个需求其实很容易实现,我给你一步步拆解下:
首先,我们先明确需求:取两个哈希映射中同时存在的键,然后把这些键对应的键值对合并成一个新映射(注意:如果同一个键在两个映射里值不同,merge会用后面映射的值覆盖前面的,这个逻辑可以根据你的需求调整)。
具体实现步骤
- 先定义两个示例哈希映射:
(def map1 {:a 1 :b 2 :c 3}) (def map2 {:b 20 :c 30 :d 40})
- 获取两个映射的共同键:
我们需要先把每个映射的键转成集合,再求集合的交集:
(def common-keys (clojure.set/intersection (set (keys map1)) (set (keys map2)))) ;; 执行后common-keys的值是 #{:b :c}
- 筛选并合并共同键的键值对:
用select-keys从原映射中筛选出共同键对应的条目,再用merge合并:
(merge (select-keys map1 common-keys) (select-keys map2 common-keys)) ;; 执行结果是 {:b 20, :c 30} —— 因为map2的键值对在merge时覆盖了map1的
简化成通用函数
如果需要多次使用这个逻辑,可以封装成一个函数:
(defn merge-common-keys [map1 map2] (let [common (clojure.set/intersection (set (keys map1)) (set (keys map2)))] (merge (select-keys map1 common) (select-keys map2 common)))) ;; 调用示例 (merge-common-keys map1 map2) ;; 返回 {:b 20, :c 30}
小提示
如果你希望保留第一个映射的键值(而不是被后面的覆盖),只需要调整merge里的顺序:
(merge (select-keys map2 common-keys) (select-keys map1 common-keys)) ;; 结果会变成 {:b 2, :c 3}
内容的提问来源于stack exchange,提问作者Rattus
相关产品推荐
相关产品推荐

