1

オブジェクトを作成し、 を使用してそれらをセットに追加してい-[NSOrderedMutableSet addObject:]ますが、オブジェクト自体の重複のみがチェックされることがわかりました。おそらくオブジェクト ポインターのアドレスであり、同一のコンテンツを持つ複数のオブジェクトを追加することが可能です。

例えば:

SomeObject* object = [SomeObject alloc] initWithStuff:stuff];
SomeObject* object2 = [SomeObject alloc] initWithStuff:stuff];

[set addObject:object];
[set addObject:object];
[set addObject:object1];
[set addObject:object2];

カウントは2になります。

これは、これらのクラスのポイントが何であるか疑問に思いますか? オブジェクトを持っていて、オブジェクトに含まれるデータではなく、オブジェクト自体が既にコレクションに追加されているかどうかがわからない場合は、どのような状況でしょうか?

セットにコンテンツに基づいて各オブジェクトが 1 つだけ含まれるようにする最も簡単な方法 (またはどのクラスを使用する必要がありますか) は何ですか?

4

2 に答える 2

4

あなたが見ている方法は正しい方法です。小さな詳細を忘れています: のどのインスタンスが同じ値NSMutableOrderedSetを含むかをクラスがどのように知ることができるでしょうか?SomeObject

答えは簡単です。独自の実装を提供する必要があります。

- (BOOL)isEqual:(id)anObject
- (NSUInteger)hash

同じ内部値と比較するとインスタンスが true を返し、同じデータを持つ 2 つのインスタンスが同じハッシュコードを持つようにします。

このセットとは別に、インスタンスがセットに含まれているかどうかを確認する際の複雑さが改善され、交差、結合、差などの多くの論理演算をすばやく実行できるため、セットはかなり便利です。

于 2012-06-26T19:49:44.513 に答える
1

それがカスタム オブジェクトである場合は、独自の isEqual: およびハッシュ メソッドを実装して、同等性をチェックし、セット内の重複を防ぐ必要があります。

于 2012-06-26T19:50:23.450 に答える