删除集合列表中的所有子集

dur*_*rai 3 clojure set subset

我有一个set元素列表.例:

'([0 1 2][1 2 3] [4 5 6] [5 6 7] [0 1 2 3] [4 5 6 7])
Run Code Online (Sandbox Code Playgroud)

我想删除子集 - [0 1 2] [1 2 3] [4 5 6] [5 6 7]- 最终的答案应该是'([0 1 2 3] [4 5 6 7]).

任何帮助是极大的赞赏.

提前致谢.

BLU*_*IXY 6

(defn to-superset [ coll ]
  (loop [result () coll coll]
    (if (empty? coll) result
      (let  [x  (first coll)
             xs (rest coll)]
            (if (some #(clojure.set/subset? x %) xs) 
                (recur result xs)
                (recur (cons x result) xs))))))

(to-superset '(#{0 1 2} #{1 2 3} #{4 5 6} #{5 6 7} #{0 1 2 3} #{4 5 6 7}))
Run Code Online (Sandbox Code Playgroud)

DEMO

user=> (to-superset '(#{0 1 2} #{1 2 3} #{4 5 6} #{5 6 7} #{0 1 2 3} #{4 5 6 7}))
(#{4 5 6 7} #{0 1 2 3})
Run Code Online (Sandbox Code Playgroud)

  • 据我所知,这是唯一正确的答案 - 其他答案似乎期望手动识别子集. (2认同)