【Swift】Set型(集合)とは?使い方やメソッドまとめ!和集合/積集合
この記事からわかること
- SwiftのSet型|集合とは?
- 使い方やメリット
- 使えるメソッドや和集合の抽出方法
- 重複しない一意の値のみの配列を作成する
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Set型|集合とは?
SwiftのSet型(集合)とは順序を持たず、値を一意に保持するコレクション型(※)の1つです。※他には配列型(Array)や辞書型(Dictionary)がある
基本的な仕組みは配列と同じですが、保持する値は、同じ集合内で重複する値がある場合は自動で除去されます。
Set型|集合の特徴
- 順序は保証しない
- 重複する値は保持しない
使い方
@frozen struct Set<Element> where Element : Hashable
Swiftで集合を扱うにはSet構造体を使います。変数に格納する際は型としてSetを指定するかSet
構造体のイニシャライザを使用します。
let langSet:Set = ["HTML","CSS","JavaScript","PHP","Swift"]
let langSet = Set(["HTML","CSS","JavaScript","PHP","Swift"])
値のデータ型
扱う値のデータ型を指定する際は<型名>
の形式で指定します。初期値がある場合は型推論で型が決まるので<型名>
は省略できますが、空の集合を定義する場合は型の定義が必須になります。
let langSet:Set<String> = ["HTML","CSS","JavaScript","PHP","Swift"]
let numSet:Set = [1,2,3]
let numSet:Set<Int> = []
特徴
順序は保証しない
let numSet: Set = [1,2,3]
print(numSet) // [2,3,1]
重複する値は保持しない
let numSet: Set = [1,2,3,3,4,2]
print(numSet) // [1,2,3,4]
Set型で使えるプロパティやメソッド
変数に格納したSet型に対して用意されたプロパティやメソッドを呼び出すことで様々な情報や要素を取得できます。
isEmpty:空かどうか
集合が空かどうかを識別し、空ならtrue
、要素があればfalse
を返します。
let numSet: Set = [1,2,3]
numSet.isEmpty // false
count:要素数を数える
集合の要素数をカウントします。
let numSet: Set = [1,2,3]
numSet.count // 3
capacity:容量を調べる
集合に予め容量が定義されている場合のみ容量を返します。容量を定義するにはinit(minimumCapacity: Int)
使用します。
let numSet = Set(minimumCapacity: 3)
numSet.capacity // 3
要素が存在するかどうか:contains
引数に指定した値が要素内にあるかどうかを調べます。
let numSet: Set = [1,2,3]
numSet.contains(3) // true
要素を追加する:insert
要素を追加するにはinsert
メソッドを使用します。
var numSet: Set = [1,2,3]
numSet.insert(4)
要素を追加する:insert
要素を追加するにはinsert
メソッドを使用します。
var numSet: Set = [1,2,3]
numSet.insert(4)
このメソッドはSetの中に要素を追加しますが、既に同じ値を保持している場合は追加しません。
@discardableResult
mutating func insert(_ newMember: Element) -> (inserted: Bool, memberAfterInsert: Element)
返り値として(inserted: Bool, memberAfterInsert: Element)
型を返します。inserted
では追加が完了したか(重複した値があったか)どうかを返します。
和集合や積集合を取得する
数学的な考え方において2つのグループのうち「どちらか片方に入っている集合」を和集合(∪)、「両方共に入っている集合」を積集合(∩)と呼びます。和集合のことをユニオン、積集合のことをインターセクションと呼んだりもします。
和集合:union
2つの集合の和集合だけを抽出するにはunion
を使用します。呼び出した集合と引数に指定した集合の和集合を持った集合を返り値として返します。
let numSetA: Set = [1,2,3,4,5]
let numSetB: Set = [4,5,6,7,8]
let unionSet = numSetA.union(numSetB)
print(unionSet) // [1, 8, 4, 7, 6, 5, 3, 2]
元のSetを変更したい場合はformUnion
を使用します。
var numSetA: Set = [1,2,3,4,5]
let numSetB: Set = [4,5,6,7,8]
numSetA.formUnion(numSetB)
print(numSetA) // [1, 8, 4, 7, 6, 5, 3, 2]
和集合:intersection
2つの集合の積集合だけを抽出するにはintersection
を使用します。
let numSetA: Set = [1,2,3,4,5]
let numSetB: Set = [4,5,6,7,8]
let intersectionSet = numSetA.intersection(numSetB)
print(intersectionSet) // [4, 5]
差集合:symmetricDifference
2つの集合の差集合だけを抽出するにはsymmetricDifference
を使用します。差集合はA集合の中からB集合に属する要素を全て除去した集合のこと
です。
let numSetA: Set = [1,2,3,4,5]
let numSetB: Set = [4,5,6,7,8]
let symmetricDifferenceSet = numSetA.symmetricDifference(numSetB)
print(symmetricDifferenceSet) // [7, 1, 8, 2, 3, 6]
配列から重複する値だけを除去する
Set型の特徴をうまく使うことで配列から重複する値だけを除去し、一意の値だけを保持する配列を生成することが可能になります。
方法は簡単で対象の配列をSet構造体のイニシャライザを使用して変数に格納するだけです。これだけで自動的に重複値が除去されます。続いてArray
のイニシャライザで配列に戻し、sorted
メソッドで順番を整えればOKです。
var numArray:[Int] = [1,2,3,4,5,5,5,2,3,1,3,4]
let numSet = Set(numArray)
numArray = Array(numSet).sorted()
print(numArray) // [1, 2, 3, 4, 5]
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。
私がSwift UI学習に使用した参考書