Abhinav
Abhinav

Reputation: 38162

Constructing a NSArray of UIView objects with unique center

I have a array of custom UIView objects with 2 or more objects having same center and I have to construct another array from it with distinct centers. What is the best way to do it?

I tried with below piece of code but it does not work.

self.distinctObjects = [NSMutableArray arrayWithCapacity:iAllObjects.count];

for (MyCustomView *customView in iAllObjects)
{
     BOOL hasDuplicate = [[self.distinctObjects filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.center == %@", customView.center]] count] > 0;

     if (!hasDuplicate) {
                [self.distinctObjects addObject:customView];
     }
}

Upvotes: 0

Views: 352

Answers (2)

Abhinav
Abhinav

Reputation: 38162

I fixed this with below piece of code:

NSMutableArray *uniqueCenters = [NSMutableArray arrayWithCapacity:iAllObjects.count];
self.distinctObjects = [NSMutableArray arrayWithCapacity:iAllObjects.count];

for (MyCustomView *customView in iAllObjects)
{
    if (![uniqueCenters containsObject:[NSValue valueWithCGPoint:customView.center]]) {
        [uniqueCenters addObject:[NSValue valueWithCGPoint:customView.center]];

        [self.beacons addObject:customView];
    }
}

Upvotes: 0

Arek Holko
Arek Holko

Reputation: 9006

You can't use struct's (in your case center is a CGPoint) in NSPredicate. Also comparing floating-point values directly isn't a good idea. You should follow this answer. Just replace [annotation coordinate].latitude with myView.center.x, [annotation coordinate].longitude with myView.center.y, and so on. It should be easy.

BTW your code has O(n^2) complexity, but maybe that's not a problem if the array is small.

Upvotes: 1

Related Questions