本記事ではSetクラスの性質や使い方について記述します。
Setオブジェクトを作成
Setオブジェクトを作成するには、Enumerable
モジュールの#to_set
を呼ぶかSet.new
を使用します。
Set.new
で渡せる引数はEnumerable
です。
空のSetオブジェクトを作成する
Setオブジェクトを生成するには、Set.new()
を使用します。
> s = Set.new
=> #<Set: {}>
配列からSetオブジェクトを作成する
配列のようなEnumerable
なオブジェクトを Set.new()
に渡してSetオブジェクトを生成することができます。 この際、重複した要素は削除されます。
> s2 = Set.new([1, 3, 5, 5])
=> #<Set: {1, 3, 5}>
> s2 = Set.new(1..3)
=> #<Set: {1, 2, 3}>
Enumerable
には to_set()
メソッドが用意されているので、これを使用してSetオブジェクトを生成することもできます。
> s3 = ['foo','bar'].to_set
=> #<Set: {"foo", "bar"}>
要素を追加する
Setオブジェクトに要素を追加するにはadd
メソッド、または <<
演算子を使用します。
add?
メソッドを使用した場合、重複した要素があるときの返り値がnil
になります。
> s4.add(1)
=> #<Set: {1}>
> s4 << 2
=> #<Set: {1, 2}>
> s4.add(2)
=> #<Set: {1, 2}>
> s4.add?(2)
=> nil
一度に複数の要素を追加したい場合、merge
メソッドを使用ます。
> s4.merge([3, 4, 5])
=> #<Set: {1, 2, 3, 4, 5}>
要素を削除する
Setオブジェクトにから1つの要素を取り除くには、delete
メソッドを使用します。
delete?
メソッドを使用した場合、引数に指定した要素がないときの返り値がnil
になります。
> s4.delete(1)
=> #<Set: {2, 3, 4, 5}>
> s4.delete(2)
=> #<Set: {3, 4, 5}>
> s4.delete(2)
=> #<Set: {3, 4, 5}>
> s4.delete?(2)
=> nil
一度に複数の要素を取り除くには、subtract
メソッドを使用します。
> s4.subtract([3, 4])
=> #<Set: {5}>
集合にある値が含まれているか
Set#include?
は指定した値がそのSetオブジェクトに含まれている場合にtrue
を返します。
> s = Set.new(%w(hoge foo bar))
=> #<Set: {"hoge", "foo", "bar"}>
> s.include?('hoge')
=> true
> s.include?('piyo')
=> false
Set#subset?
または<=
演算子を使用すると、あるSetオブジェクトの要素が、もう一方のSetオブジェクトにすべて含まれているかどうかを調べることができます。
irb(main):021:0> s1 = Set.new([1, 2, 3])
=> #<Set: {1, 2, 3}>
irb(main):022:0> s2 = Set.new([2, 3])
=> #<Set: {2, 3}>
irb(main):023:0> s2.subset?(s1)
=> true
irb(main):024:0> s2 <= (s1)
=> true
irb(main):025:0> s1.subset?(s2)
=> false
irb(main):026:0> s1 <= (s2)
=> false
集合の演算
和集合
+
演算子、または|
演算子、union
メソッドを使用することで、Setオブジェクト同士の和集合を求めることができます。
> s1 = Set.new([1, 2, 3])
=> #<Set: {1, 2, 3}>
> s2 = Set.new([3, 4, 5])
=> #<Set: {3, 4, 5}>
> s1 + s2
=> #<Set: {1, 2, 3, 4, 5}>
> s1 | s2
=> #<Set: {1, 2, 3, 4, 5}>
> s1.union(s2)
=> #<Set: {1, 2, 3, 4, 5}>
積集合
&
演算子を使用することで、Setオブジェクト同士の積集合を求めることができます。
> s1 & s2
=> #<Set: {3}>
排他的論理和
^
演算子を使用することで、いずれかのSetオブジェクトにしか含まれていない要素を調べることができます。
> s1 ^ s2
=> #<Set: {4, 5, 1, 2}>
差集合
-
演算子、またはdifference
メソッドを使用することで、左辺に指定したSetオブジェクトにしか存在しない要素を調べることができます。
> s1 - s2
=> #<Set: {1, 2}>
> s2.difference(s1)
=> #<Set: {4, 5}>
参考