【发布时间】:2018-03-13 09:49:29
【问题描述】:
我是 Clojure 的新手。我的问题是如何获得两个哈希图的交集,例如
(def map-1 {"a" 2, "b" 1, "c" 4, "d" 3})
(def map-2 {"a" 3, "b" 6, "e" 5})
当我们定义了两个映射时,预期的结果是{"a" 3, "b" 6},它在一个具有相交键和键的最大值的映射中。
不知何故,我想出了一个解决方案并实施了它,但它部分正确。
基本思想是找到其中项目数量最少的地图,并将其用作参考。对于参考地图中的每个项目,检查其他地图是否包含它。如果包含,则将其最大值放入输出映射的键(使用(max num1 num2))
以下是我的示例代码:
(defn max-intersect [map1 map2]
(let [smaller-map (if (< (count map1) (count map2))
map1
map2)
longer-map (if (= smaller-map map1)
map2
map1)]
(loop [output {}
reference-map smaller-map]
(if (empty? reference-map)
output
(recur (let [[item-key item-val] (first smaller-map)]
(when (contains? longer-map item-key)
(assoc output item-key (max item-val (get longer-map item-key)))))
(rest reference-map))))))
这是我的 repl 结果:
test-intersect.core=> (def map1 {"a" 2, "b" 1, "c" 4, "d" 3})
#'test-intersect.core/map1
test-intersect.core=> (def map2 {"a" 3, "b" 6, "e" 5})
#'test-intersect.core/map2
test-intersect.core=> (max-intersect map1 map2)
{"a" 3}
这可能看起来很复杂,我也在等待任何伟大而有效的解决方案。
非常感谢!
【问题讨论】:
标签: clojure