Цель 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];
}

Очень грубый псевдокод, но, надеюсь, вы понимаете суть:)

Другие вопросы по тегам