2013-01-08 105 views
1

我有兩套,需要創建第三個,其中包括從第一個,在第二個是不存在的元素:如何分離兩組?

(? #{"a" "b" "c"} #{"b"}) ; -> ["a" "c"] 

我知道disj,但它只能當第二個參數是一個元素,而不是一個集合。

+1

要從集合中刪除任何集合,而不是另一個集合,可以將disj與'reduce'結合起來,如下所示:'(reduce disj#{1 2 3} [3 4 5])' – Alex

回答

7

如果你有兩套,您可以使用set difference

user=> (require 'clojure.set) 
user=> (difference #{"a" "b" "c"} #{"b"}) 
#{"a" "c"} 
2

如果沒有一個差函數,你可能已經與降低創造了它很容易:

=> (reduce disj #{"a" "b" "c" "d"} #{"b" "d"}) 
#{"a" "c"} 

減少花費函數,初始「累加器」和它映射的集合來修改累加器。在這種情況下,它將使用第一個集合作爲累加器,從第二個集合中刪除第一個項目,然後從第二個集合中刪除,等等。

+0

我認爲這是一般情況下的差異。關於這一點的好處是你可以用任何集合(列表,向量,seq等)替換第二個集合,它仍然可以工作。 – Alex

+0

對不起亞歷克斯,沒有注意到你在OP的評論中發佈了完全相同的解決方案。 – NielsK

+0

不用擔心 - 我沒有把它寫成答案,所以我認爲它是公平的遊戲:) – Alex