アプリで NSSet を何度も使用していますが、自分で作成したことはありません。
11 に答える
Apple のドキュメントの画像は、それを非常によく説明しています。
Array
順序付けられた(追加時に順序が維持される) 要素のシーケンス
[array addObject:@1];
[array addObject:@2];
[array addObject:@3];
[array addObject:@4];
[array addObject:@6];
[array addObject:@4];
[array addObject:@1];
[array addObject:@2];
[1, 2, 3, 4, 6, 4, 1, 2]
Set
個別の(重複なし)順序付けされていない要素のリストです
[set addObject:@1];
[set addObject:@2];
[set addObject:@3];
[set addObject:@4];
[set addObject:@6];
[set addObject:@4];
[set addObject:@1];
[set addObject:@2];
[1, 2, 6, 4, 3]
コレクション内の項目の順序が重要でない場合は、セットを使用すると、コレクション内の項目を見つけるパフォーマンスが向上します。
その理由は、セットはハッシュ値を使用して項目 (辞書など) を検索するのに対し、配列は特定のオブジェクトを検索するためにコンテンツ全体を反復処理する必要があるためです。
これに対する最良の答えは、Apple 独自のドキュメントです。
主な違いは、それNSArray
がNSSet
順序付けられたコレクション用であり、順序付けられていないコレクション用であることです。
この 1 つのように、2 つの速度の違いについて説明している記事がいくつかあります。順序付けられていないコレクションを反復処理している場合NSSet
は、素晴らしいです。ただし、多くの場合、 にしかNSArray
できないことを行う必要があるため、その能力のために速度を犠牲にします。
NSセット
- 主にアイテムを比較してアクセスする
- 順不同
- 重複を許可しない
NSアレイ
- インデックスでアイテムにアクセスできます
- 順序付けられました
- 重複を許可
本当にそれだけです!それが役立つかどうか教えてください。
NSOrderedSet は iOS 5 以降で使用できるため、主な違いは、データ構造でオブジェクトを複製するかどうかになります。
NSArray :
- 順序付けられたデータの収集
- 重複を許可
- コレクション型のオブジェクトです
NSセット:
- 順不同のデータ収集
- 重複を許可しない
- コレクション型のオブジェクトでもあります
配列は、インデックスによってアイテムにアクセスするために使用されます。任意のアイテムを配列に複数回挿入できます。配列は、要素の順序を管理します。
セットは、基本的にアイテムがコレクションにあるかどうかを確認するためにのみ使用されます。アイテムには、順序やインデックス付けの概念はありません。セットにアイテムを2回含めることはできません。
配列に要素が含まれているかどうかを確認する場合は、すべての項目を確認する必要があります。セットは、より高速なアルゴリズムを使用するように設計されています。
値のない辞書のようなセットを想像することができます。
配列とセットだけがデータ構造ではないことに注意してください。他にも、キュー、スタック、ヒープ、フィボナッチヒープなどがあります。アルゴリズムとデータ構造についての本を読むことをお勧めします。
詳細については、ウィキペディアを参照してください。
主な違いは、他の回答ですでに示されています。
セットとディクショナリの実装方法 (つまり、ハッシュの使用) のため、キーに変更可能なオブジェクトを使用しないように注意する必要があることに注意してください。
キーが変更された場合、ハッシュも (おそらく) 変更され、ハッシュ テーブル内の別のインデックス/バケットを指します。元の値は削除されず、構造体にそのサイズ/カウントを列挙または要求するときに実際に考慮されます。
これにより、特定が非常に困難なバグが発生する可能性があります。
ここNSArray
では、とデータ構造のかなり完全な比較を見つけることができますNSSet
。
短い結論:
はい、単純に保持して反復する場合、NSArray は NSSet よりも高速です。構築がわずか 50% 速く、反復が最大 500% 高速です。教訓: 内容を繰り返し処理するだけであれば、NSSet を使用しないでください。
もちろん、含めるかどうかをテストする必要がある場合は、NSArray を避けるように努力してください。繰り返しテストと包含テストの両方が必要な場合でも、おそらく NSSet を選択する必要があります。コレクションの順序を維持し、含まれているかどうかをテストする必要がある場合は、それぞれが同じオブジェクトを含む 2 つのコレクション (NSArray と NSSet) を保持することを検討する必要があります。
NSDictionary は、キー データをコピーする必要があるため、NSMapTable よりも構築に時間がかかります。ルックアップを高速化することでこれを補います。もちろん、この 2 つは異なる機能を持っているため、ほとんどの場合、この決定は他の要因で行う必要があります。
通常、アクセス速度が本質的であり、順序が重要ではない場合、または他の手段 (述語またはソート記述子を介して) によって決定される場合は、Set を使用します。たとえば、Core Data は、対多関係を介して管理対象オブジェクトにアクセスするときにセットを使用します