2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Ruby】Setクラス(集合)の扱い方

Posted at

本記事では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}>

参考

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?