18

私のアプリには、プロパティを持つクラスPersonがありpersonIdます。
ここで、一連の一意のオブジェクトを保持するためのデータ構造が必要Personです (unique = different personId)

したがって、データ構造として NSMutableSet を使用する必要があると思いますがpersonId、人を追加するときに NSMutableSet でプロパティを比較するにはどうすればよいですか (そのため、同じ人を複数人追加しません)。

私の目標は、常に一意の人物のコレクションを保持することです (同じ ID を持つ 2 人の人物を追加した場合でも)。 2回追加することはありません。

4

3 に答える 3

34

によって比較がどのように行われるかを理解することで、それを実現できますNSSet。セットに新しいオブジェクトを追加すると、セットの各要素に対してisEqual:method が呼び出されます (メソッドです)。NSObjectしたがって、このメソッドをオーバーライドして、次のようなカスタム比較を提供することができます。

ノート:

isEqual:メソッドをオーバーライドする場合は、メソッドもオーバーライドする必要がありますhash

// In your Person.m
- (BOOL)isEqual:(id)anObject
{
    return [self.personId isEqual:anObject.personId]; 
    // If it's an object. Otherwise use a simple comparison like self.personId == anObject.personId
}

- (NSUInteger)hash
{
    return self.personId; //Must be a unique unsigned integer
}
于 2012-05-14T15:34:23.193 に答える
4

あなたが望むのは、をオブジェクトNSMutableDictionaryにマッピングすることだと思います。personIdPerson

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];

Person *person = something;
[dict setObject:personObj forKey:[NSNumber numberWithInt:[person personId]]];
... etc ...

dict(後でどこかでリリースすることを忘れないでください)。

指定された(12 など)のPersonクラスを見つけるには、次のようにします。personId

Person *person = [dict objectForKey:[NSNumber numberWithInt:12]];

注: キーと値の両方をオブジェクトとして保存する必要があることに注意してください (プリミティブ型は保存できません)。

于 2012-05-14T15:26:12.160 に答える
0

配列に項目を追加するときは、これについて心配する必要はありません。毎回一意のオブジェクトを追加している限り、オブジェクトのプロパティは重要ではありません。

これが心配で、二重に確実にしたい場合は、代わりに NSMutableSet を使用してください (各オブジェクトの順序を維持する必要がない場合)。

アップデート

述語を使用して、同じ値を持つオブジェクトが存在しないことを追加する前に確認できます。これは、NSMutableArray と NSMutableSet の両方でうまく機能します。

//create array
NSMutableArray *array = [[NSMutableArray alloc] init];

//create person
Person *newPerson = [[Person alloc] init];

//add person
[array addObject:newPerson]

//check new object exists
if([[array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"personID == %@", [newPerson personID]]] count] == 0)
{
    //add object
    [array addObject:newPerson];
}

非常に大まかな擬似コードですが、要点を理解していただければ幸いです :)

于 2012-05-14T15:22:52.043 に答える