English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Swift 集合(Set)

このチュートリアルでは、集合の作成、集合の変更、集合内の一般的な操作について学びます。

前回のSwift 数組この記事では、値を含む有序リストを作成する方法について学びました。

しかし、リストにユニークな値のみを確保する必要がある場合、Swiftのset(集合)を使用します。

集合とは何ですか?

集合はただの容器であり、無序列表中に複数のデータタイプの値を保存し、容器内の要素が一意であることを確実にします(つまり、各データが一度だけ現れます)。

無序列表の場合、集合内の要素の順序に基づいて要素を取得することができません。

集合と配列を比較して、主な利点は、一度に一つの要素が現れることを確実にし、要素の順序が重要でない場合です。

集合に格納される値はハッシュ可能でなければなりません。これは、ハッシュ値プロパティを提供する必要があることを意味します。これは非常に重要です。なぜなら、集合は無序であり、要素にアクセスするためにハッシュ値を使用するからです。

デフォルトでは、Swiftのすべての基本タイプ(String、Int、Double、Boolなど)はハッシュ可能で、集合の値として使用できます。ただし、Swiftで集合に格納できるハッシュ可能なタイプを作成することもできます。

Swiftで集合を宣言する方法はどうですか?

タイプを指定して、<>内に格納できるデータ型を指定することで、空集合を作成できます。

例1:空集合を宣言します

let emptyIntSet:Set= []
print(emptyIntSet)

または

let emptyIntSet:Set= Set()
print(emptyIntSet)

プログラムを実行するとき、出力は以下のようになります:

[ ]

上記のプログラムでは、emptyInt という名前の Set 型定数を宣言し、複数の整数值を格納できるコレクションを定義し、0値で初期化しました。

Swift は型推論言語であるため、データ型を指定せずに直接 set コレクションを作成することもできますが、コンパイラがそのタイプを推論できるようにいくつかの値を初期化する必要があります:

例2:特定の値を持つコレクションを宣言します

let someIntSet:Set = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(someIntSet)

プログラムを実行するとき、出力は以下のようになります:

[2, 4, 9, 5, 6, 7, 3, 1, 8]

上記のプログラムでは、someIntSet という名前の定数を宣言し、Integer コレクションを格納できますが、明示的にタイプを指定する必要はありません。ただし、変数を定義する際には :Set を付ける必要があります。さもなければ、Swift は配列を作成してくれます。

さらに、配列として、[]括弧を使用して 1、2、3、4、5、6、7、8、9 値がコレクションを初期化します。

あなたは既に知っているように、コレクション内の値を print(someIntSet) として印刷しようとすると、異なる順序で出力されます。コレクション内に定義したプロジェクトの順序とは異なる順序です。なぜなら、コレクションは値の順序を定義していないからです。したがって、アクセスするたびに順序が変更されます。

例3:重複値を持つコレクションを宣言します

let someStrSet:Set = ["ab","bc","cd","de","ab"]
print(someStrSet)

プログラムを実行するとき、出力は以下のようになります:

["de", "ab", "cd", "bc"]

あなたは既に知っているように、コレクション内の値を print(someIntSet) として印刷しようとすると、上記のプログラムではコレクションに重複値 ab を定義しました。また、print(someStrSet) を使用してコレクション内の値にアクセスしようとすると、重複値は自動的にコレクションから削除されます。したがって、set はその中のユニークな要素を保証します。/値。

また、Swiftで独自のカスタムHashable型を使用して集合を宣言することもできます。

Swiftでsetの要素にどうやってアクセスしますか?

インデックスを使用して集合の要素にアクセスすることはできません。なぜなら、集合は無秩序であり、要素にアクセスするインデックスがありません。
したがって、メソッドや属性を使用するか、forを使用する必要があります。-inループを使用して集合にアクセスします。

例4:for...inを使用して集合の要素にアクセス

var someStrSet:Set = ["ab", "bc", "cd", "de"]
for val in someStrSet {
    print(val)
}

プログラムを実行するとき、出力は以下のようになります:

de
ab
cd
bc

上記のプログラムでは、取得したvalは集合内の要素の順序と異なるため、集合は配列とは異なり、無秩序であることがわかります。

また、以下のように集合の要素にアクセスして値を直接削除することもできます:

例5:remove()を使用して集合の要素にアクセス

var someStrSet:Set = ["ab", "bc", "cd", "de"]
let someVal = someStrSet.remove("cd")
print(someVal)
print(someStrSet)

プログラムを実行するとき、出力は以下のようになります:

Optional("cd")
["de", "ab", "bc"]

上記のプログラムでは、removeメソッドがオプション文字列を返すことがわかります。したがって、以下のオプション処理を実行することをお勧めします。オプションの詳細については、以下のURLにアクセスしてください。Swiftのオプション

例6:remove()のオプション処理

var someStrSet:Set = ["ab", "bc", "cd", "de"]
if let someVal = someStrSet.remove("cd") {
    print(someVal)
    print(someStrSet)
} else {
    print("cannot find element to remove")
}

プログラムを実行するとき、出力は以下のようになります:

cd
["de", "ab", "bc"]

集合に新しい要素をどうやって追加しますか?

Swiftでinsert()メソッドを使用して集合に新しい要素を追加できます。

例7:insert()を使用して新しい要素を追加

var someStrSet:Set = ["ab", "bc", "cd", "de"]
someStrSet.insert("ef")
print(someStrSet)

プログラムを実行するとき、出力は以下のようになります:

["ab", "de", "cd", "ef", "bc"]

上記のプログラムでは、insert()メソッドを使用して新しい要素を集合に追加しています。集合は無秩序であるため、要素を挿入する位置は未知です。

集合の操作

集合の主要な利点の1つは、集合操作を実行できることです。例えば、2つの集合を組み合わせたり、2つの集合がどの値を共有しているかを確認したりするなど、これらの操作は数学の集合操作に似ています。

1.和集合

二つの集合aとbの和集合は、aまたはbに含まれるまたは両方に含まれる要素の集合です。

let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 2, 4, 6, 8]
print(a.union(b))

上記のプログラムを実行すると、出力は以下のようになります:

[8, 2, 9, 4, 5, 7, 6, 3, 1, 0]

2.交集合

二つの集合aとbの交集合は、aのすべての要素を含み、同時にbに属する要素も含む集合です。

let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 3, 7, 6, 8]
print(a.intersection(b))

上記のプログラムを実行すると、出力は以下のようになります:

[7, 3]

したがって、print(a.intersection(b))は新しい集合を出力します [7、3] aとbの集合に共に存在します。

3.差集合

二つの集合aとbの差集合は、aのすべての要素を含みますが、bに属する同じ要素を取り除いた集合です。

let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 3, 7, 6, 8]
print(a.subtracting(b))

上記のプログラムを実行すると、出力は以下のようになります:

[5, 9, 1]

したがって、print(a.subtracting(b))は以下の値を出力します[ 5、9、1]の新しい集合。

4.対称差集合

二つの集合aとbの対称差は、二つの集合のいずれか一方に存在するが両方に存在しないすべての要素を含む集合です。

let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 3, 7, 6, 8]
print(a.symmetricDifference(b))

上記のプログラムを実行すると、出力は以下のようになります:

[5, 6, 8, 0, 1, 9]

したがって、print(a.symmetricDifference(b))は以下の値を出力します[ 5、6、8、0、1、9]の新しい集合。

集合メンバー関係と等価演算

集合等価

==演算子を使用して、二つの集合が同じ要素を含んでいるかどうかを確認できます。二つの集合が同じ要素を含んでいる場合、trueを返し、そうでない場合、falseを返します。

例5:集合等価操作

let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 3, 7, 6, 8]
let c:Set = [9, 7, 3, 1, 5]
if a == b {
    print("aとbが同じ")
} else {
    print("aとbが異なる")
}
if a == c {
    print("aとcが同じ")
} else {
    print("aとcが異なる")
}

上記のプログラムを実行すると、出力は以下のようになります:

aとbが異なる
aとcが同じ

集合メンバー関係

以下のメソッドを使用して、二つの集合の関係を確認できます:

  • isSubset(of:) - このメソッドは、ある集合のすべての値が指定された集合に存在するかどうかを確認します。

  • isSuperset(of:)  - このメソッドは、集合が指定された集合のすべての値を含んでいるかどうかを確認します。

  • isStrictSubset(of:)またはisStrictSuperset(of:): - このメソッドは、ある集合が指定された集合の部分集合または超集合であるかどうかを確認しますが、指定された集合と等しくありません。

  • isDisjoint(with:)  - このメソッドは、二つの集合が共通の値を持っていないかどうかを確認します。

例6:集合メンバー関係操作

let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 3, 1, 7, 6, 8, 9, 5]
print("isSubset:", a.isSubset(of: b))
print("isSuperset:", b.isSuperset(of: a))
print("isStrictSubset:", a.isStrictSubset(of: b))
print("isDisjointWith:", a.isDisjoint(with: b))

上記のプログラムを実行すると、出力は以下のようになります:

isSubset: true
isSuperset: true
isStrictSubset: true
isDisjointWith: false

以下のprint文で使用されているメソッドを分析しましょう:

  • isSubsetがtrueを返します。なぜなら集合bはaのすべての要素を含んでいるからです。

  • isSupersetがtrueを返します。なぜならbはaのすべての値を含んでいるからです。

  • isStrictSubsetがtrueを返します。なぜなら集合bはaのすべての要素を含んでいて、二つの集合が異なるからです。

  • isDisjointWithがfalseを返します。なぜならaとbには共通の値があるからです。

集合の内蔵関数と属性

1. isEmpty 属性

この属性は集合が空かどうかを確認します。集合に値が含まれていない場合、trueを返し、そうでない場合はfalseを返します。

例7:isEmptyはどう働きますか?

let intSet:Set = [21, 34, 54, 12]
print(intSet.isEmpty)

プログラムを実行するとき、出力は以下のようになります:

false

2.first 属性

この属性は集合の最初の要素にアクセスするために使用されます。

例8:firstはどう働きますか?

let intSet = [21, 34, 54, 12]
print(intSet.first)

プログラムを実行するとき、出力は以下のようになります:

Optional(54)

Setは無順序集合であるため、first属性は必ずしも集合の最初の要素ではありません。おそらく54以外の他の値。

同様に、last属性を使用して集合の最後の要素にアクセスできます。

3.insert 関数 - 要素を挿入します

insert関数は集合に要素を/要素を追加します。

例9:insert関数はどう働きますか?

var intSet:Set = [21, 34, 54, 12]
intSet.insert(50)
print(intSet)

プログラムを実行するとき、出力は以下のようになります:

[54, 12, 50, 21, 34]

4.reversed() - 集合を反転します

この関数は集合の要素を逆の順序で返します。

例10:reversed()はどう働きますか?

var intSet:Set = [21, 22, 23, 24, 25]
print(intSet)
let reversedSet = intSet.reversed()
print(reversedSet)

プログラムを実行するとき、出力は以下のようになります:

[22, 23, 21, 24, 25]
[25, 24, 21, 23, 22]

5.count - 集合内の要素の合計数を返します。

この属性は集合内の要素の合計数を返します。

例11:count カウントはどのように動作しますか?

let floatSet:Set = [10.2, 21.3, 32.0, 41.3]
print(floatSet.count)

プログラムを実行するとき、出力は以下のようになります:

4

6. removeFirst - 削除し返す集合の最初の値

この関数は集合から最初の値を削除し、返します。

例12:removeFirstはどのように動作しますか?

var strSet:Set = ["ab", "bc", "cd", "de"]
let removedVal = strSet.removeFirst()
print("removed value is \(removedVal)")
print(strSet)

プログラムを実行するとき、出力は以下のようになります:

removed value is de
["ab", "cd", "bc"]

同様に、removeAll 関数を使用して集合を空にすることもできます。