Я хочу найти общие элементы в двух [списках, векторах, последовательностях], когда могут быть дубликаты.Общие элементы в двух списках с дубликатами
(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 показал мне, что я редко пишу наиболее идиоматический или сжатый код, так что я интересно узнать, есть ли лучший способ сделать это.
Чтобы уточнить: ваши структуры входных данных следует рассматривать как мультимножества? (Элементы могут появляться несколько раз, но их порядок не имеет значения?) – bdesham
Правильно, я не заинтересован в заказе, просто в содержании. В моей текущей реализации общие элементы упорядочиваются, поскольку они упорядочены в coll1, но это произвольно. –