【发布时间】:2013-08-09 17:09:52
【问题描述】:
当可能有重复时,我想在两个[列表、向量、序列]中找到共同的元素。
(common-elements [1] [1]) ; [1]
(common-elements [1 2] [1 1]) ; [1]
(common-elements [1 1] [1 1 1]) ; [1 1]
这是我目前拥有的:
(defn remove-first [elem coll]
(lazy-seq
(when-let [s (seq coll)]
(let [f (first s), r (rest s)]
(if (= elem f)
r
(cons f (remove-first elem r)))))))
(defn common-elements [coll1 coll2]
(lazy-seq
(when (and (seq coll1) (seq coll2))
(let [f (first coll1)]
(if (some #{f} coll2)
(cons f (common-elements (rest coll1)
(remove-first f coll2)))
(common-elements (rest coll1) coll2)))))
4clojure 的经验告诉我,我很少编写最惯用或最简洁的代码,因此我很想知道是否有更好的方法来做到这一点。
【问题讨论】:
-
澄清一下:您的输入数据结构应该被视为多重集吗? (元素可能出现不止一次,但它们的顺序无关紧要?)
-
正确,我对订购不感兴趣,只是内容。在我当前的实现中,公共元素按照它们在 coll1 中的顺序进行排序,但这是任意的。
标签: list clojure set-intersection