SwiftのSet(セット)入門|重複排除と高速検索・集合演算をわかりやすく解説!
生徒
「Swiftで、同じ値を重複して入れたくないときはどうすればいいですか?」
先生
「そんなときはSet(セット)というコレクション型を使うのが便利ですよ。SwiftのSetは、重複を自動で排除してくれます。」
生徒
「Setって、ArrayやDictionaryとはどう違うんですか?」
先生
「Setは順番を気にせず、素早く検索したいときや、重複を避けたいときに活躍します。今回はその特徴や使い方を丁寧に見ていきましょう。」
1. SwiftのSetとは?特徴を確認しよう
SwiftのSetは、重複する値を自動で排除するコレクション型です。「集合」という数学の概念と同じで、「同じ値は1つだけ」に保たれます。順番には意味がありません。
例えば、同じ名前を何回も入れたつもりでも、Setでは1回分しか記録されません。
2. Setの基本的な書き方と初期化方法
Setの定義は、Arrayと似ていますが、中身が重複しない点が大きな違いです。以下のように書きます。
var colors: Set<String> = ["赤", "青", "緑", "赤"]
print(colors)
このコードでは「赤」が2回入っていますが、Setは自動で重複を排除します。
["赤", "青", "緑"]
3. 要素の追加・削除・検索をしてみよう
Setの操作はとてもシンプルです。値の追加、削除、検索の方法を順に見てみましょう。
値を追加する
var fruits: Set = ["りんご", "バナナ"]
fruits.insert("みかん")
print(fruits)
値を削除する
fruits.remove("バナナ")
print(fruits)
値が含まれているか調べる(検索)
if fruits.contains("りんご") {
print("りんごが含まれています")
}
りんごが含まれています
4. Setの高速な検索性能が便利な理由
SetはArrayよりも高速に検索ができます。なぜなら、Setは内部的にデータの管理を最適化していて、特定の値があるかどうかを一瞬で判断できるからです。
例えば、1万件のデータから「バナナ」があるかどうかを調べる場合、Arrayは順番に探しますが、Setならほぼ一発で見つかります。
5. Setの集合演算:合体や共通部分を調べよう
Setの最大の魅力は、「集合演算」ができることです。数学で習った集合と同じように、合体・共通部分・差を簡単に求められます。
合体(union)
let a: Set = [1, 2, 3]
let b: Set = [3, 4, 5]
let unionSet = a.union(b)
print(unionSet)
[1, 2, 3, 4, 5]
共通部分(intersection)
let commonSet = a.intersection(b)
print(commonSet)
[3]
差(subtracting)
let onlyA = a.subtracting(b)
print(onlyA)
[1, 2]
6. SetとArrayの違いを理解しよう
初心者が混乱しやすいのが、SetとArrayの違いです。以下のような違いがあります。
- Array:順番がある、重複OK
- Set:順番なし、重複NG、検索が速い
順番が重要ならArray、重複をなくしたい・検索を早くしたいならSetを選びましょう。
7. Setを活用する具体例
例えば、ユーザーが入力したキーワードに重複があっても無視したい場合や、ログイン履歴で同じIDを一回だけ記録したい場合にSetは便利です。
以下の例では、重複したIDを1つにまとめています。
let logins = ["user1", "user2", "user1", "user3"]
let uniqueLogins = Set(logins)
print(uniqueLogins)
["user1", "user2", "user3"]
8. Setの初期化方法と注意点
Setは、空の状態から初期化もできます。ただし、型を明示する必要があります。
var emptySet = Set<String>()
emptySet.insert("Swift")
print(emptySet)
["Swift"]
また、Arrayと混同しないように、Setに順番を期待しないことが大事です。