18

在我的应用程序中,我有一个Person带有personId属性的类。
现在我需要一些数据结构来保存一堆独特的Person对象(独特的=不同的personId)

所以我想我应该使用 NSMutableSet 作为我的数据结构,但是如何让 NSMutableSetpersonId在添加一个人时比较属性(所以我不会再添加同一个人)?

我的目标是始终拥有一组独特的人(即使我添加了两个具有相同 ID 的人),我希望 NSMutableSet 将为我完成所有艰苦的工作,如果我要添加一个已经存在的人它不会添加两次。

4

3 回答 3

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
}
于 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稍后在某个地方发布)。

为了找到Person指定personId(例如 12 个)的类,您可以简单地执行以下操作:

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 回答