【Swift】集合の使い方。インデックス番号や重複が無いデータの集まり。(Swift 2.1、XCode 7.2)

2020年6月16日

集合の特徴

集合(Set)は、配列と同じように複数のデータを1つの変数で管理できる入れ物である。配列と異なる点は「インデックス番号がない」、「値を重複することができない」、「集合演算を使える」の3点である。

(配列については次の記事を参照。⇒「記事」)

配列はインデックス番号「0」から順番に番号が振られた箱の中にデータを格納していき、同じ値のデータが重複しても問題ない。

set_hairetsu_exam

 

一方、集合にはインデックス番号が無く、格納されている順番にも意味は無い。そして、格納するデータは重複できない。
集合のイメージ図

 

さらに、重複しないデータの集合であることを活用して集合演算のメソッドが用意されている。情報処理試験でよく出題される和集合、差集合などの考え方だ。集合演算を使うために集合を使うプログラマーも多い。

配列は以下のコードのように[値,値,値, …]で作る。重複している値は1つにまとめられる。「:Set」を省略すると配列になってしまうので注意が必要だ。

 

以下のコードのように格納する型を指定して集合を作れば、格納するデータを制限することができる。

 

空の集合を作るには以下のコードのようにする。型を指定しない空の集合を1行で定義する方法は分かっていない。2行で書くなら、格納データをつけて定義したあとに[]を代入することで空の集合にすることができる。1行で定義する方法を発見したら後日記述する。

 

集合の要素を取得する

集合の要素にはインデックス番号がついていないので、番号を使って要素を取得することはできない。firstプロパティを使えば先頭のデータを取得することができるが、集合の格納順に意味は無いので使いどころが難しい。よって、集合は1個のデータをピンポイントで取得するといった使い方には適していない。

 

集合のすべての要素を1つずつ取得するには以下のコードのようfor-in文を用いる。

 

その他、集合の情報を知るプロパティには以下のようなものがある。

集合を操作する

集合に要素を追加するには以下のコードのようにする。

 

集合の要素を削除するには以下のコードのようにする。removeメソッドの戻り値に削除したデータが設定されてくるので、戻り値を確認してデータが削除されたかを知ることができる。

 

集合の要素から要素を1つ取り出すにはpopFirstメソッドを使う。取り出した要素は集合から削除される。1回使用すれば不要になるデータを処理するときに便利なメソッドだ。集合が空の場合はnilが戻る。

removeFirstメソッドでも同じようなことができるが、removeメソッドは集合が空の場合はエラーが発生してしまう。なので、メソッドを呼び出す前にisEmptyメソッドなどを使い、集合が空かどうかをチェックする必要がある。

 

集合演算

集合を使う大きな利点は集合演算にある。例えば、下図のA、Bの集合があったとする。このとき、AとBの片方だけに存在するデータを抽出したい。AとBの両方に存在すデータを抽出したい。このような願いを叶えてくれるのが集合演算である。

2つの集合

 

和集合は「AとBの全てのデータを抽出したい」ときに使える集合演算である。A、Bに格納されている全てのデータを重複を取り除いて取得することができる。

和集合

具体的には以下のコードのようになる。unionInPlaceメソッドを使えば、和集合の結果を元の集合に代入することができる。

 

差集合は「Aだけにあるデータを抽出したい。」または「Bだけにあるデータを抽出したい。」ときに使える集合演算である。AからBを引く、または、BからAを引くイメージである。

差集合

具体的には以下のコードのようになる。

 

積集合は「AとBのどちらにも存在するデータを抽出したい」ときに使える集合演算である。

積集合

具体的には以下のコードのようになる。

 

対称差集合は「AとBの片方だけにあるデータを抽出したい」ときに使える集合演算である。

対称差集合

具体的は以下のコードのようになる。

 

上記4つの集合演算を使えば、集合を組み合わせて複雑なデータ抽出作業を簡単に行えるようになる。

ちなみに、配列は「+演算子」を使って配列同士を結合することができるが、集合はできない。なので、集合で結合が必要なときは必ずunionを使うようにしよう。