5

I have NSMutableSet of objects. All objects are unique obviously, but they might have same .angle value, which is NSInteger property.

I need to find out if there are two or more objects with the same .angle value and group then into an array.

How can i do that?
Any guidance would be much appreciated

Nick Weaver
  • 47,228
  • 12
  • 98
  • 108
devster
  • 53
  • 1
  • 4

3 Answers3

12

Use an instance of NSPredicate to filter on the property you're interested in. For example:

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);
jlehr
  • 15,557
  • 5
  • 43
  • 45
0

Might depend on how big your data set it. If large, you might have to sort by .angle and look for duplicates. Simple way is just to create a copy of data set, iterate it, for item N, look at N+1 to the end for all with same .angle and if found, remove them from this copy set and add to output set.

David Neiss
  • 8,161
  • 2
  • 20
  • 21
0

You can use sortUsingFunction:context: method of NSMutableArray. (Though it is for sorting you can get your task done with better efficiency).

  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.
  }
}

Hope it helps.

Janak Nirmal
  • 22,706
  • 18
  • 63
  • 99