2012-05-14 5 views
18

私のアプリでは、クラスPersonpersonIdというプロパティがあります。
今私はだから私は、私は私のデータ構造としてNSMutableSetを使用する必要がありますね、しかし、どのように私はNSMutableSetのときpersonIdプロパティを比較しますかユニークPersonオブジェクト(ユニーク=異なるPERSONID)目的c - NSMutableSet一意のオブジェクトのプロパティ

の束を保持するために、いくつかのデータ構造を必要とします人を追加します(私は同じ人を複数追加しません)。

私の目標は、(同じIDの2人を追加しても)一意の人物を常に集めることです。NSMutableSetは私のために大変な作業をしてくれます。既に存在する人はそれを2回追加しません。

答えて

32

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

注:

あなたは

// 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 
} 
+0

ありがとうこれは私が探していたものです:) – Eyal

+0

私のpersonIdがNSStringの場合、ちょうど1つの事、私はどのようにハッシュメソッドをオーバーライドする必要がありますか? – Eyal

+1

これを '[self.personId intValue]'のようにintにキャストするだけです。あなたの比較のために: '[self.personId isEqualToString:anObject.personId]' – Alladinian

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]; 
} 

非常にラフな擬似コードが、うまくいけば、あなたはその要旨を取得:)

+0

同様isEqual:方法あなた必見オーバーライドhashメソッドをオーバーライドする場合はマイ目標は、同じIDの人を2人追加しても一意の人物を集めることです。NSMutableSetが私のために大変な仕事をしてくれることを願っています。それを2回追加しないでください.. – Eyal

+0

述語を使用して、オブジェクトがすでに同じ値で存在するかどうかを確認することができます。 – CaptainRedmuff

+0

NSMutableSetはperson idを自動的にチェックしません。 2つのオブジェクトが実際に同じ正確なオブジェクトを指している場合に限り、2つのオブジェクトが同じであるとみなします。あなたは、以下に述べるように辞書を使うほうがよいです。それはあなたのために同じpersonIDsの置き換えを行います。 –

4

私はあなたが何をしたいと思いますPersonオブジェクトにpersonIdをマッピング、NSMutableDictionaryです。

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

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

(後でdictをリリースすることを忘れないでください)。指定されたpersonIdためPersonクラスを見つけるために

(12、と言う)、あなたは、単に行うことができます。

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

注:(オブジェクトとしてあなたをキーと値の両方を保存するために持っていることをプリミティブ型は格納できません)。

+0

見てください私は私の質問で詳細を説明しました – Eyal

+1

@Eyal私の答えはあなたが望むことをすると思います。同じ 'personId'を持つ別のオブジェクトを追加すると、古い' Person'オブジェクトが置き換えられます。 – trojanfoe

関連する問題