2012-05-14 60 views
18

在我的应用程序中,我有一个类PersonpersonId属性。
现在我需要一些数据结构来保存一堆独特Person对象的(唯一=不同PERSONID)目标c - NSMutableSet唯一对象属性

所以我想我应该使用的NSMutableSet作为我的数据结构,但我怎么做的NSMutableSet比较personId属性时添加一个人(所以我不会添加更多的同一个人)?

我的目标是始终有一个独特的人的集合(即使我添加两个具有相同ID的人),我希望NSMutableSet将为我做所有的辛苦工作,如果我添加已经存在的人不会添加两次。

回答

32

您可以通过了解NSSet的比较方式来实现此目的。 将新对象添加到集合中时,将调用isEqual:方法(对于每个集合的元素,它是一个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 
} 
+0

感谢这就是我一直在寻找:) – Eyal

+0

只是一件事,如果我的personId是NSString,我应该如何重写散列方法? – Eyal

+1

只需将其转换为像下面这样的int:'[self.personId intValue]'。和你的比较使用:'[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

我目标是始终拥有一组独特的人(即使我添加了两个具有相同ID的人),我希望NSMutableSet能够为我做出艰苦的工作,如果我添加了一个已经存在的人,再加两次.. – Eyal

+0

您可以使用谓词来检查对象是否已经存在具有相同的值 - 请参阅我的编辑。 – CaptainRedmuff

+0

NSMutableSet不会自动检查人员ID。它会认为两个对象只有在它们确实指向相同的确切对象时才是相同的。如下所述,您最好使用字典。它会为你替换相同的personID。 –

4

我想你想要的是一个NSMutableDictionary,映射personIdPerson对象。

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

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

(不要忘记稍后在某处发布dict)。

为了找到Person类指定personId(12,说),你可以简单地做:

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

注意:你必须同时存储键和值对象(您不能存储原始类型)。

+0

请看我在我的问题中解释得更多 – Eyal

+1

@Eyal我想我的答案会做你想做的事;如果添加具有相同'personId'的另一个对象,则旧的'Person'对象将被替换。 – trojanfoe