开发者

Adding items from an NSDictionary to an NSMutableArray

开发者 https://www.devze.com 2023-04-13 08:41 出处:网络
I\'m trying to make an implementation of a k-means clustering algorithm for map annotations using the iPhone MapKit. I\'ve got 2 classes which implement MKAnnotation: PostLocationAnnotation for indivi

I'm trying to make an implementation of a k-means clustering algorithm for map annotations using the iPhone MapKit. I've got 2 classes which implement MKAnnotation: PostLocationAnnotation for individual points and LocationGroupAnnotation for clusters of points. The header for LocationGroupAnnotation is as follows:

@interface LocationGroupAnnotation : NSObject <MKAnnotation>
{

    NSMutableArray *_locations;
    CLLocationCoordinate2D _coordinate;

}

@property (nonatomic, retain) NSArray *locations;
@property (nonatomic, assign) CLLocationCoordinate2D coordinate;

+ (LocationGroupAnnotation *)initWithLocations:(NSArray *)locationArray;
+ (LocationGroupAnnotation *)initWithCoordinate:(CLLocationCoordinate2D)coordinate;
- (id)initWithLocations:(NSArray *)locationArray;
- (id)initWithCoordinate:(CLLocationCoordinate2D)startCoordinate;
- (void)addAnnotation:(PostLocationAnnotation *)annotation;
- (NSUInteger)locationCount;

@end

In my map view controller, I have a method to add all of the PostLocationAnnotations to LocationGroupAnnotations by creating k LocationGroupAnnotations (using the initWithCoordinate method) each with a location selected at random from the annotations, and adding PostLocationAnnotations to their nearest LocationGroupAnnotations. For this, I use an NSMutableArray of NSMutableDictionary obje开发者_开发知识库cts, like so ('means' is an NSMutableArray of LocationGroupAnnotations which has been populated before this):

// find nearest cluster to each point
NSMutableArray *distances = [[NSMutableArray alloc] initWithCapacity:[[ffMapView annotations] count]];

for (id <MKAnnotation> point in [ffMapView annotations])
{
    if ([point isKindOfClass:[PostLocationAnnotation class]])
    {
        NSMutableDictionary *distanceDict = [[NSMutableDictionary alloc] initWithCapacity:2];

        [distanceDict setObject:point forKey:@"location"];

        double minDistance = 0;
        LocationGroupAnnotation *closestMean = nil;

        for (id <MKAnnotation> meanPoint in means)
        {
            if ([meanPoint isKindOfClass:[LocationGroupAnnotation class]])
            {
                if (closestMean)
                {
                    if ([ClusteringTools getDistanceBetweenPoint:[point coordinate] and:[meanPoint coordinate]] < minDistance)
                    {
                        closestMean = meanPoint;
                        minDistance = [ClusteringTools getDistanceBetweenPoint:[point coordinate] and:[meanPoint coordinate]];
                    }
                } else {
                    closestMean = meanPoint;
                    minDistance = [ClusteringTools getDistanceBetweenPoint:[point coordinate] and:[meanPoint coordinate]];
                }
            }
        }

        [distanceDict setObject:closestMean forKey:@"closestMean"];

        [distances addObject:distanceDict];

        [distanceDict release];
    }
}

// add annotations to clusters
for (NSDictionary *entry in distances)
{
    [(LocationGroupAnnotation *)[entry objectForKey:@"closestMean"] addAnnotation:[entry objectForKey:@"location"]];
}

The problem I am having is when I output the locationCount of each LocationGroupAnnotation after this, I get 0 for each one. I have a log output for each time an annotation is added, like so (in LocationGroupAnnotation):

- (void)addAnnotation:(PostLocationAnnotation *)annotation
{
    [_locations addObject:annotation];
    NSLog(@"Added annotation at (%f,%f) to cluster %@", 
        [annotation coordinate].latitude,
        [annotation coordinate].longitude,
        [self description]);
}

...and it looks like everything is being added where it should, judging by the memory addresses. So what's going on?


Do you initialize _locations anywhere? It looks like you could be merrily adding objects to nil which would not cause any errors.

You haven't shown the code but you also have a property locations which is an NSArray and an instance variable _locations which is an NSMutableArray, are you doing anything clever with this in the background which could be messing things up? How are you linking those two properties together?

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号