NSMutableDictionary рассчитать расстояние до маркера

Рейтинг: 0Ответов: 1Опубликовано: 15.04.2015

Подскажите, просто не знаю в сторону каких функций копать, вот есть такой словарик

        states = [[NSMutableDictionary alloc]init];
   [states setObject:@"60.050043,30.345783" forKey:[NSString stringWithFormat:@"Distance is %f km", (betweenDistance / 1000)] ];
   [states setObject:@"60.037389,30.322094" forKey:[NSString stringWithFormat:@"Distance is %f km", (betweenDistance4 / 1000)] ];
    [states setObject:@"60.037329,30.322014" forKey:[NSString stringWithFormat:@"Distance is %f km", (betweenDistance5 / 1000)] ];
   [states setObject:@"59.957387,30.324681" forKey:[NSString stringWithFormat:@"Distance is %f km", (betweenDistance3 / 1000)] ];
     datasource = [states allKeys];

если вкрации - словарь выводится в tableview, там при нажатии открывается detailview с картой гугла на которой отражаются маркер. Координаты маркера это Object в словаре.В tableview выводится key (т.е. расстояние до маркера). Т.е. (betweenDistance3 / 1000) переменная которая образовывается из float betweenDistance5=[startLocation distanceFromLocation:location5]; а эта переменная образуется из CLLocation *location5 = [[CLLocation alloc] initWithLatitude:60.037329 longitude:30.322014];. И вот собственно вопрос как мне в tableview вывести cell от меньшего расстояния к большему? Можно ли это сделать как то в словаре? (переменные наверно нет смысла перебирать, потому что идёт жесткая привязка объект - ключ (т.е. определённые координаты соответствуют определённое переменной (betweenDistance3 / 1000)))

UPDATE

     [states setObject:[NSString stringWithFormat:@"Distance is %f km", (betweenDistance5 / 1000)] forKey:@"60.037329,30.322014" ];
 [states setObject:[NSString stringWithFormat:@"Distance is %f km", (betweenDistance3 / 1000)] forKey:@"59.957387,30.324681" ];
 datasource = [states allValues];
NSArray* sortedStates = [states keysSortedByValueUsingComparator: ^(id obj1, id obj2)
{
    if ([obj1 floatValue] < [obj2 floatValue])
    {
        return (NSComparisonResult)NSOrderedDescending;
    }
    if ([obj1 floatValue] > [obj2 floatValue])
    {
        return (NSComparisonResult)NSOrderedAscending;
    }

    return (NSComparisonResult)NSOrderedSame;
}];

  [states setObject:@"60.050043,30.345783" forKey:[NSString stringWithFormat:@"Distance is %f km", (betweenDistance / 1000)] ];
[states setObject:@"60.037389,30.322094" forKey:[NSString stringWithFormat:@"Distance is %f km", (betweenDistance4 / 1000)] ];
 [states setObject:@"60.037329,30.322014" forKey:[NSString stringWithFormat:@"Distance is %f km", (betweenDistance5 / 1000)] ];
 [states setObject:@"59.957387,30.324681" forKey:[NSString stringWithFormat:@"Distance is %f km", (betweenDistance3 / 1000)] ];
 datasource = [states allKeys];
NSArray* sortedStates = [states keysSortedByValueUsingComparator: ^(id obj1, id obj2)
{
    if ([obj1 floatValue] < [obj2 floatValue])
    {
        return (NSComparisonResult)NSOrderedDescending;
    }
    if ([obj1 floatValue] > [obj2 floatValue])
    {
        return (NSComparisonResult)NSOrderedAscending;
    }

    return (NSComparisonResult)NSOrderedSame;
}];

Ответы

▲ 2Принят

Чтобы избежать бага, описанного в комментарии, можно использовать словарь, только нужно поменять в нем ключ со значением. Тогда ключом будет координата, а значением - расстояние. Из этого словаря можно получить массив ключей (координат), отсортированных по значению (расстоянию).

NSMutableDictionary* states = [[NSMutableDictionary alloc]init];
[states setObject: @(betweenDistance / 1000) forKey:@"60.050043,30.345783"];
[states setObject: @(betweenDistance4 / 1000) forKey:@"60.037389,30.322094"];
[states setObject: @(betweenDistance5 / 1000) forKey:@"60.037329,30.322014"];
[states setObject: @(betweenDistance3 / 1000) forKey:@"59.957387,30.324681"];

NSArray* sortedStates = [states keysSortedByValueUsingComparator: ^(id obj1, id obj2)
{
    if ([obj1 floatValue] > [obj2 floatValue])
    {
        return (NSComparisonResult)NSOrderedDescending;
    }
    if ([obj1 floatValue] < [obj2 floatValue])
    {
        return (NSComparisonResult)NSOrderedAscending;
    }

    return (NSComparisonResult)NSOrderedSame;
}];

UPDATE:

Строки таблицы:

NSMutableArray* rows = [[NSMutableArray alloc] init];
    for (NSString* key in sortedStates)
    {
        CGFloat distance = [[states objectForKey:key] floatValue];
        [rows addObject:[NSString stringWithFormat:@"Distance is %f km", distance]];
    }

При выборе строки вызывается метод

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString* coord = sortedStates[indexPath.row];
}

Эту coord можно передать дальше.