Добавление элементов из NSDictionary в NSMutableArray - PullRequest
0 голосов
/ 17 октября 2011

Я пытаюсь реализовать алгоритм кластеризации k-средних для аннотаций карты с помощью iPhone MapKit.У меня есть 2 класса, которые реализуют MKAnnotation: PostLocationAnnotation для отдельных точек и LocationGroupAnnotation для кластеров точек.Заголовок для LocationGroupAnnotation выглядит следующим образом:

@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

В моем контроллере представления карты у меня есть метод для добавления всех PostLocationAnnotations в LocationGroupAnnotations путем создания k LocationGroupAnnotations (с использованием метода initWithCoordinate) для каждого с выбранным местоположениемслучайным образом из аннотаций и добавление PostLocationAnnotations к ближайшим LocationGroupAnnotations.Для этого я использую NSMutableArray объектов NSMutableDictionary, например так («средства» - это NSMutableArray для LocationGroupAnnotations, который был заполнен до этого):

// 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"]];
}

Проблема, с которой я сталкиваюсь, заключается в том, что при выводе locationCountПосле каждого LocationGroupAnnotation после этого я получаю 0 для каждого.У меня есть вывод журнала для каждого добавления аннотации, например, (в LocationGroupAnnotation):

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

... и похоже, что все добавляется в нужном месте, судя по адресам памяти.Так что же происходит?

1 Ответ

2 голосов
/ 17 октября 2011

Вы инициализируете _locations где-нибудь?Похоже, вы можете весело добавлять объекты в nil, что не приведет к ошибкам.

Вы не показали код, но у вас также есть свойство locations, которое является NSArray, и переменная экземпляра _locations, которая является NSMutableArray, вы делаете что-нибудь умное с этим вфон, который может все испортить?Как вы связываете эти два свойства вместе?

...