Цель c - NSMutableSet уникальное свойство объекта
В моем приложении у меня есть класс Person
с personId
имущество.
Теперь мне нужна структура данных для хранения уникальных Person
объекты (уникальный = другой человек)
Поэтому я думаю, что я должен использовать NSMutableSet в качестве моей структуры данных, но как мне сделать NSMutableSet сравнить personId
свойство при добавлении человека (поэтому я не буду добавлять одного и того же человека более одного)?
Моя цель - постоянно иметь коллекцию уникальных людей (даже если я добавлю двух человек с одинаковым идентификатором), я хочу, чтобы NSMutableSet сделал всю тяжелую работу за меня, и если я добавлю человека, который уже существует это не добавит это дважды.
3 ответа
Вы можете достичь этого, понимая, как проводится сравнение 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
}
Я думаю, что вы хотите, это NSMutableDictionary
, картирование personId
к Person
объект.
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]];
Примечание: вы должны хранить ключ и значение как объекты (вы не можете хранить примитивные типы).
Вам не нужно беспокоиться об этом при добавлении элементов в массив. Пока вы добавляете уникальный объект каждый раз, свойства объекта не должны иметь значения.
Если вы беспокоитесь об этом и хотите быть уверенным вдвойне, используйте взамен 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];
}
Очень грубый псевдокод, но, надеюсь, вы понимаете суть:)