#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.
}
}
Надеюсь, это поможет.