갈루아의 반서재

집합은 유일한 값들의 컬렉션이다. 요소의 중복이 없는 컬렉션을 만들 때 유용하다. 

집합은 #{} 로 둘러싼다.

집합을 생성할 때는 당연히 중복은 허용되지 않는다.

1
2
3
4
5
6
7
 
user=> #{:red :blue :white :pink}
#{:white :red :blue :pink}
 
user=> #{:red :blue :white :pink :pink}
IllegalArgumentException Duplicate key: :pink  clojure.lang.PersistentHashSet.createWithCheck (PersistentHashSet.java:68)
 
cs

union, difference, intersection 과 집합연산이 가능하다. 

집합연산을 하기 위해서는 그 함수 앞에 clojure.set 을 붙여주어야 한다. 

union

1
2
3
4
5
 
user=> (clojure.set/union #{:r :b :w} #{:w :p :y})
#{:y :r :w :b :p}
user=>
 
cs

difference
1
2
3
4
5
 
user=> (clojure.set/difference #{:r :b :w} #{:w :p :y})
#{:r :b}
user=>
 
cs

intersection

1
2
3
4
5
 
user=> (clojure.set/intersection #{:r :b :w} #{:w :p :y})
#{:w}
user=>
 
cs


set 함수를 이용해 다른 종류의 컬렉션을 집합으로 바꿀 수 있다. 

집합은 키와 값이 같은 맵이라고 보면 된다. 

1
2
3
4
5
6
7
8
9
 
user=> (set [:rabbit :rabbit :watch :door])
#{:door :watch :rabbit}
user=>
 
user=> (set {:a 1 :b 2 :c 3})
#{[:c 3] [:b 2] [:a 1]}
user=>
 
cs


집합에서 요소를 갖고 올려면 get 함수를 이용하면 된다. 

1
2
3
4
5
6
7
 
user=> (get #{:rabbit :door :watch} :rabbit)
:rabbit
user=> (get #{:rabbit :door :watch} :jar)
nil
user=>
 
cs

키워드로 직접 접근할 수도 있다. 

1
2
3
4
5
 
user=> (:rabbit #{:rabbit :door :watch})
:rabbit
user=>
 
cs

집합 자체를 함수로 사용하여 같은 일을 할 수 있다.

1
2
3
4
5
 
user=> (#{:rabbit :door :watch} :rabbit)
:rabbit
user=>
 
cs


집합에 포함된 요소를 확인하기 위한 다른 방법으로 contains? 가 있다.

1
2
3
4
5
6
7
 
user=> (contains? #{:rabbit :door :watch} :rabbit)
true
user=> (contains? #{:rabbit :door :watch} :jam)
false
user=>
 
cs

집합 자체를 함수로 사용하는 경우 집합에 nil 이 포함되어 있을 때는 contains? 를 사용하면 된다.

1
2
3
4
5
6
7
 
user=> (#{:rabbit nil} nil)
nil
user=> (contains? #{:rabbit nil} nil)
true
user=>
 
cs


집합에 요소를 추가하기 위해 conj 를 사용한다. 

1
2
3
4
5
 
user=> (conj #{:rabbit :door} :jam)
#{:door :rabbit :jam}
user=>
 
cs

disj 함수는 요소를 제거할 때 사용한다. 

1
2
3
4
5
 
user=> (disj #{:rabbit :door} :door)
#{:rabbit}
user=>
 
cs