在我的应用中,我有一个Person
类,personId
属性
现在我需要一些数据结构来保存一堆独特的Person
对象(唯一=不同的personId)
所以我想我应该使用NSMutableSet作为我的数据结构,但是如何在添加一个人时让NSMutableSet比较personId
属性(所以我不会再添加同一个人)?< / p>
我的目标是始终拥有一组独特的人(即使我添加了两个具有相同ID的人),我希望NSMutableSet能为我做所有艰苦的工作,如果我要添加一个人它已经存在,它不会添加两次。
答案 0 :(得分:34)
您可以通过了解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
}
答案 1 :(得分:4)
我认为您想要的是NSMutableDictionary
,将personId
映射到Person
对象。
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
Person *person = something;
[dict setObject:personObj forKey:[NSNumber numberWithInt:[person personId]]];
... etc ...
(不要忘记稍后在某处释放dict
。
为了找到指定Person
的{{1}}类(比方说12),您可以这样做:
personId
注意:您必须将键和值都存储为对象(不能存储基本类型)。
答案 2 :(得分: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];
}
非常粗糙的伪代码,但希望你得到要点:)