Поиск объектов с одинаковым значением свойства в NSMutableSet

#iphone #objective-c #nsmutableset

#iPhone #objective-c #nsmutableset

Вопрос:

У меня есть NSMutableSet объектов. Очевидно, что все объекты уникальны, но они могут иметь одинаковое значение .angle, которое является свойством NSInteger.

Мне нужно выяснить, есть ли два или более объектов с одинаковым значением .angle и сгруппировать их в массив.

Как я могу это сделать?
Любые рекомендации были бы высоко оценены

Ответ №1:

Используйте экземпляр NSPredicate для фильтрации по интересующему вас свойству. Например:

 NSSet *dogs = [NSSet setWithObjects:
                [Dog dogWithName:@"Fido" age:2],
                [Dog dogWithName:@"Fluffy" age: 3],
                [Dog dogWithName:@"Spot" age:2],
                nil];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age == %d", 2];
NSSet *twoYearOldDogs = [dogs filteredSetUsingPredicate:predicate];

NSLog(@"%@", twoYearOldDogs);
  

Комментарии:

1. Спасибо за пример NSPredicate.

Ответ №2:

Может зависеть от размера ваших данных. Если они большие, возможно, придется сортировать по .angle и искать дубликаты. Простой способ — просто создать копию набора данных, выполнить итерацию, для элемента N просмотреть N 1 до конца для всех с одинаковым углом обзора и, если найдено, удалить их из этого набора копий и добавить в выходной набор.

Ответ №3:

Вы можете использовать sortUsingFunction:context: метод NSMutableArray. (Хотя это для сортировки, вы можете выполнить свою задачу с большей эффективностью).

   NSComparisonResult compare(YourClass *firstObject, YourClass *secondObject, void *context) {
  if ([firstObject angle] < [secondObject angle])
    return NSOrderedAscending;
  else if ([firstObject angle] > [secondObject angle])
    return NSOrderedDescending;
  else 
  {
    //Normally here NSOrderedSame is returned. 
    //Put your logic stuff here.i.e. storing object for having common angle.
  }
}
  

Надеюсь, это поможет.