集
與地圖一樣,集合是關聯的和無序的。與包含從鍵到值的對映的對映不同,集合實際上是從鍵對映到它們自身。
一個集合由大括號表示,前面是一個八角形:
#{}
;;=> #{}
#{:foo}
;;=> #{:foo}
#{:foo :bar}
;;=> #{:bar :foo}
與地圖一樣,元素在文字集中出現的順序無關緊要:
(= #{:foo :bar} #{:bar :foo})
;;=> true
你可以使用 set?
謂詞測試某些內容是否為集合 :
(set? #{})
;;=> true
(set? #{:foo})
;;=> true
(set? #{:foo :bar})
;;=> true
(set? nil)
;;=> false
(set? 42)
;;=> false
(set? :foo)
;;=> false
你可以使用 contains?
謂詞測試地圖是否在常量時間內包含給定專案 :
(contains? #{} :foo)
;;=> false
(contains? #{:foo} :foo)
;;=> true
(contains? #{:foo} :bar)
;;=> false
(contains? #{} nil)
;;=> false
(contains? #{nil} nil)
;;=> true
另外,set 本身是一個函式,它接受一個元素,如果它存在於集合中則返回該元素,如果不存在則返回 nil
:
(#{} :foo)
;;=> nil
(#{:foo} :foo)
;;=> :foo
(#{:foo} :bar)
;;=> nil
(#{} nil)
;;=> nil
(#{nil} nil)
;;=> nil
你可以使用 conj
獲取具有現有集合的所有元素的集合,以及一個附加專案:
(conj #{} :foo)
;;=> #{:foo}
(conj (conj #{} :foo) :bar)
;;=> #{:bar :foo}
(conj #{:foo} :foo)
;;=> #{:foo}
你可以使用 disj
獲取具有現有集合的所有元素的集合,減去一個專案:
(disj #{} :foo)
;;=> #{}
(disj #{:foo} :foo)
;;=> #{}
(disj #{:foo} :bar)
;;=> #{:foo}
(disj #{:foo :bar} :foo)
;;=> #{:bar}
(disj #{:foo :bar} :bar)
;;=> #{:foo}
count
以恆定時間返回元素數:
(count #{})
;;=> 0
(count (conj #{} :foo))
;;=> 1
(count #{:foo :bar})
;;=> 2
你可以使用 seq
獲取集合中所有元素的序列:
(seq #{})
;;=> nil
(seq #{:foo})
;;=> (:foo)
(seq #{:foo :bar})
;;=> (:bar :foo)