Как сравнить два NSS-набора на основе атрибутов объектов?

У меня есть два nssets.

nsset1: person.id = 1, person.id = 2, person.id = 3 nsset2: person.id = 1, person.id = 2 

Результаты должны быть:

 nsset1 - nsset2: person (with id 3) nsset2 - nsset1: null 

Эти объекты с одним и тем же идентификатором в этих двух наборах являются разными объектами, поэтому я не мог просто делать minusSet.

Я хочу сделать что-то вроде:

 nsset1: person.id = 1, person.id = 2, person.id = 3 nsset2: person.id = 4, person.id = 5 

Результаты должны быть такими:

 nsset1 - nsset2: person (id 1), person (id 2), person (id 3) nsset2 - nsset1: person (id 4), person (id 5) 

Каков наилучший способ сделать это?

Вы должны попробовать что-то вроде этого

 NSSet* nsset1 = [NSSet setWithObjects:person_with_id_1, person_with_id_2, person_with_id_3, nil]; NSSet* nsset2 = [NSSet setWithObjects:person_with_id_2, person_with_id_4, nil]; // retrieve the IDs of the objects in nsset2 NSSet* nsset2_ids = [nsset2 valueForKey:@"objectID"]; // only keep the objects of nsset1 whose 'id' are not in nsset2_ids NSSet* nsset1_minus_nsset2 = [nsset1 filteredSetUsingPredicate: [NSPredicate predicateWithFormat:@"NOT objectID IN %@",nsset2_ids]]; 

@ Ответ AliSoftware – интересный подход. NSPredicate довольно медленный за пределами Core Data, но это часто хорошо. Если производительность является проблемой, вы можете реализовать тот же алгоритм с циклом, который является еще несколькими строками кода, но, как правило, быстрее.

Другой подход заключается в том, чтобы спросить, должны ли два человека с одинаковым идентификатором всегда считаться эквивалентными. Если это так, то вы можете переопределить isEqual: и hash для вашего класса человека как это (при условии, что identifier – NSUInteger):

 - (BOOL)isEqual:(id)other { if ([other isMemberOfClass:[self class]) { return ([other identifier] == [self identifier]); } return NO; } - (NSUInteger)hash { return [self identifier]; } 

При этом все операции NSSet будут обрабатывать объекты с одинаковым идентификатором равными, поэтому вы можете использовать minusSet . Также NSMutableSet addObject: будет автоматически уникальным для вас по идентификатору.

Реализация isEqual: и hash имеет широкомасштабные воздействия, поэтому вам нужно убедиться, что каждый раз, когда вы сталкиваетесь с двумя объектами с одним и тем же идентификатором, их следует рассматривать как равные. Но если это так, это значительно упрощает и ускоряет работу вашего кода.

  • NSSet Iteration потребляет больше времени, чем NSMutableArray Iteration и NSArray Iteration потребляет больше времени, чем NSMutableArray Iteration
  • Является ли NSS быстрее, чем NSArray?
  • NSSet, как извлечь объект случайно?
  • получение данных из coredata, где объект имеет NSSet
  • Объект поиска NSPredicate с атрибутом в NSSet
  • NSSet: должен ли я использовать float / double в NSSet?
  • Как сохранить и прочитать из NSObject
  • iOS - Самый эффективный способ подсчета количества слов в строке
  • «NSSet allObjects» делает случайный порядок?
  • Преобразование NSMutableArray в NSSet с тем же порядком
  • Как превратить NSArray строк в массив уникальных строк в том же порядке?
  • Давайте будем гением компьютера.