English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、集合の作成、集合の変更、集合内の一般的な操作について学びます。
前回のSwift 数組この記事では、値を含む有序リストを作成する方法について学びました。
しかし、リストにユニークな値のみを確保する必要がある場合、Swiftのset(集合)を使用します。
集合はただの容器であり、無序列表中に複数のデータタイプの値を保存し、容器内の要素が一意であることを確実にします(つまり、各データが一度だけ現れます)。
無序列表の場合、集合内の要素の順序に基づいて要素を取得することができません。
集合と配列を比較して、主な利点は、一度に一つの要素が現れることを確実にし、要素の順序が重要でない場合です。
集合に格納される値はハッシュ可能でなければなりません。これは、ハッシュ値プロパティを提供する必要があることを意味します。これは非常に重要です。なぜなら、集合は無序であり、要素にアクセスするためにハッシュ値を使用するからです。
デフォルトでは、Swiftのすべての基本タイプ(String、Int、Double、Boolなど)はハッシュ可能で、集合の値として使用できます。ただし、Swiftで集合に格納できるハッシュ可能なタイプを作成することもできます。
タイプを指定して、<>内に格納できるデータ型を指定することで、空集合を作成できます。
let emptyIntSet:Set= [] print(emptyIntSet)
または
let emptyIntSet:Set= Set() print(emptyIntSet)
プログラムを実行するとき、出力は以下のようになります:
[ ]
上記のプログラムでは、emptyInt という名前の Set 型定数を宣言し、複数の整数值を格納できるコレクションを定義し、0値で初期化しました。
Swift は型推論言語であるため、データ型を指定せずに直接 set コレクションを作成することもできますが、コンパイラがそのタイプを推論できるようにいくつかの値を初期化する必要があります:
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) として印刷しようとすると、異なる順序で出力されます。コレクション内に定義したプロジェクトの順序とは異なる順序です。なぜなら、コレクションは値の順序を定義していないからです。したがって、アクセスするたびに順序が変更されます。
let someStrSet:Set = ["ab","bc","cd","de","ab"] print(someStrSet)
プログラムを実行するとき、出力は以下のようになります:
["de", "ab", "cd", "bc"]
あなたは既に知っているように、コレクション内の値を print(someIntSet) として印刷しようとすると、上記のプログラムではコレクションに重複値 ab を定義しました。また、print(someStrSet) を使用してコレクション内の値にアクセスしようとすると、重複値は自動的にコレクションから削除されます。したがって、set はその中のユニークな要素を保証します。/値。
また、Swiftで独自のカスタムHashable型を使用して集合を宣言することもできます。
インデックスを使用して集合の要素にアクセスすることはできません。なぜなら、集合は無秩序であり、要素にアクセスするインデックスがありません。
したがって、メソッドや属性を使用するか、forを使用する必要があります。-inループを使用して集合にアクセスします。
var someStrSet:Set = ["ab", "bc", "cd", "de"] for val in someStrSet { print(val) }
プログラムを実行するとき、出力は以下のようになります:
de ab cd bc
上記のプログラムでは、取得したvalは集合内の要素の順序と異なるため、集合は配列とは異なり、無秩序であることがわかります。
また、以下のように集合の要素にアクセスして値を直接削除することもできます:
var someStrSet:Set = ["ab", "bc", "cd", "de"] let someVal = someStrSet.remove("cd") print(someVal) print(someStrSet)
プログラムを実行するとき、出力は以下のようになります:
Optional("cd") ["de", "ab", "bc"]
上記のプログラムでは、removeメソッドがオプション文字列を返すことがわかります。したがって、以下のオプション処理を実行することをお勧めします。オプションの詳細については、以下のURLにアクセスしてください。Swiftのオプション。
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()メソッドを使用して集合に新しい要素を追加できます。
var someStrSet:Set = ["ab", "bc", "cd", "de"] someStrSet.insert("ef") print(someStrSet)
プログラムを実行するとき、出力は以下のようになります:
["ab", "de", "cd", "ef", "bc"]
上記のプログラムでは、insert()メソッドを使用して新しい要素を集合に追加しています。集合は無秩序であるため、要素を挿入する位置は未知です。
集合の主要な利点の1つは、集合操作を実行できることです。例えば、2つの集合を組み合わせたり、2つの集合がどの値を共有しているかを確認したりするなど、これらの操作は数学の集合操作に似ています。
二つの集合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]
二つの集合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の集合に共に存在します。
二つの集合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]の新しい集合。
二つの集合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を返します。
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:) - このメソッドは、二つの集合が共通の値を持っていないかどうかを確認します。
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には共通の値があるからです。
この属性は集合が空かどうかを確認します。集合に値が含まれていない場合、trueを返し、そうでない場合はfalseを返します。
let intSet:Set = [21, 34, 54, 12] print(intSet.isEmpty)
プログラムを実行するとき、出力は以下のようになります:
false
この属性は集合の最初の要素にアクセスするために使用されます。
let intSet = [21, 34, 54, 12] print(intSet.first)
プログラムを実行するとき、出力は以下のようになります:
Optional(54)
Setは無順序集合であるため、first属性は必ずしも集合の最初の要素ではありません。おそらく54以外の他の値。
同様に、last属性を使用して集合の最後の要素にアクセスできます。
insert関数は集合に要素を/要素を追加します。
var intSet:Set = [21, 34, 54, 12] intSet.insert(50) print(intSet)
プログラムを実行するとき、出力は以下のようになります:
[54, 12, 50, 21, 34]
この関数は集合の要素を逆の順序で返します。
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]
この属性は集合内の要素の合計数を返します。
let floatSet:Set = [10.2, 21.3, 32.0, 41.3] print(floatSet.count)
プログラムを実行するとき、出力は以下のようになります:
4
この関数は集合から最初の値を削除し、返します。
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 関数を使用して集合を空にすることもできます。