clojure.core のセットに関する var
セット = 集合
順序・重複要素を持たない コレクション
Clojure におけるセットは、clojure.lang.IPersistentSet インタフェースを実装したインスタンス
関数
set: 引数のコレクション(シーケンスやマップ、文字列など)をセットに変換する
code:clj
(set 1 2 2 3 3) ; #{1 3 2}
(set '(1 2 2 3 3)) ; #{1 3 2}
(set {:a 1 :b 2 :c 3}) ; #{:c 3 :b 2 :a 1}
(set "hello") ; #{\e \h \l \o}
set?: 引数が IPersistentSet インタフェースを実装しているか
code:clj
(map set? [ #{} {}]) ; (false false true false)
(map set? 1 :keyword nil "string") ; (false false false false)
hash-set: 与えられたキーを持つ新しいハッシュセットを返す
code:clj
(hash-set 1 2 3) ; #{1 3 2}
ハッシュセットでは、重複するキーは自動的に除外される
code:clj
(hash-set 1 2 2 3 1 2) ; #{2 3 1 2}
引数を渡さない場合、空のハッシュセットを返す
code:clj
(hash-set) ; #{}
set と同様、PersistentHashSet インスタンスを返す
code:clj
(map type [(set 1) (hash-set 1)])
;; (clojure.lang.PersistentHashSet clojure.lang.PersistentHashSet)
sorted-set: 重複するキーを持つ引数から、ソートされたセット(PersistentTreeSet)を作成する
code:clj
(sorted-set 1 3 2 1) ; #{1 2 3}
(sorted-set "b" "a" "c" "a") ; #{"a" "b" "c"}
(type (sorted-set 1)) ; clojure.lang.PersistentTreeSet
(def s (sorted-set 1 2 3)) ; #'user/s
(conj s 1) ; #{1 2 3}
(conj s 4) ; #{1 2 3 4}
sorted-set-by: 比較関数 を指定して新しいソートされたセットを作成する
比較関数は 2 つの引数を受け取り、負の値を返せば左の引数が、正の値を返せば右の引数が小さいことを意味する
e.g.
code:clj
#(compare %2 %1)
#(compare (count %2) (count %1))
code:clj
(sorted-set-by > 3 1 4 1 5 9 2 6 5) ; #{9 6 5 4 3 2 1}
(sorted-set-by #(compare %2 %1) 3 1 4 1 5 9 2 6 5) ; #{9 6 5 4 3 2 1}
(sorted-set-by #(compare (count %2) (count %1)) "hello" "world" "clojure" "java")
;; #{"clojure" "hello" "java"
disj: 指定された要素を除外した新しいセットを返す
code:clj
(disj #{1 2 3} 2) ; #{1 3}
(disj #{:a :b :c} :b :c) ; #{:a}
(disj #{1 2 3} 1 2 3) ; #{}
除外するデータが見つからなくてもエラーにならない
code:clj
(disj #{} 1) ; #{}
#Clojure