0

В моем проекте я пытаюсь сравнить известное местоположение с введенным местоположением, используя блок sortedArrayUsingComparator:^(id a, id b). У меня есть словарь-массив, называемый locationArray, содержащий long long и номер станции, который соответствует этой длинной точке lat. Я пытаюсь сравнить каждую позицию Arrray станции с введенной станцией. Я делаю это, беря абсолютную величину разницы между двумя, которая дает мне расстояние. Затем я пытаюсь сортировать locationArray на основе расстояния от введенной станции от ближайшего до самого дальнего.Использование блока sortedArrayUsingComparator:^(id a, id b)

//locationArray 

#define kStation @"station" 
#define kLatitude @"latitude" 
#define kLongitude @"longitude" 




NSString *filePath = [[NSBundle mainBundle] pathForResource:@"499CSV" ofType:@"csv"]; 
NSString *csvString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; 

NSArray *locations = [csvString componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; 

NSMutableArray *CSVArray = [NSMutableArray array]; 


NSCharacterSet *whiteSPNewLine = [NSCharacterSet whitespaceAndNewlineCharacterSet]; 
for (NSString * location in locations) 
{ 

NSArray *components = [location componentsSeparatedByString:@","]; 

double latitude = [[components[0] stringByTrimmingCharactersInSet:whiteSPNewLine] doubleValue]; 
double longitude = [[components[1] stringByTrimmingCharactersInSet:whiteSPNewLine] doubleValue]; 
NSString *station = [components[2] stringByTrimmingCharactersInSet:whiteSPNewLine]; 

NSDictionary *dict = @{kLatitude: @(latitude), 
         kLongitude: @(longitude), 
         kStation: station}; 

[CSVArray addObject:dict]; 

} 

NSLog(@"The contents of CSVArray = %@",[CSVArray description]); 


{ 
    latitude = "41.674364"; 
    longitude = "-81.23700700000001"; 
    station = 40150; 
}, 
    { 
    latitude = "41.67517"; 
    longitude = "-81.235038"; 
    station = 40763; 
}, 
    { 
    latitude = "41.673106"; 
    longitude = "-81.24017499999999"; 
    station = 39175; 
}, ... 

Мой блок-код, который непосредственно следует за местоположениемArray.

NSArray *orderedPlaces = [CSVArray sortedArrayUsingComparator:^(id a, id b) { 

NSDictionary *dictA; 
NSDictionary *dictB; 

NSString *locA; 
NSString *locB; 

int distanceA; 
int distanceB; 


dictA = (NSDictionary *)a; 
dictB = (NSDictionary *)b; 

NSLog(@"dictA = %@", dictA); 
NSLog(@"dictB = %@", dictB); 


locA = [dictA objectForKey:kStation]; 
locB = [dictB objectForKey:kStation]; 

NSLog(@"locA = %@", locA); 
NSLog(@"locB = %@", locB); 



distanceA = abs(stationNumber-[locA intValue]); 
distanceB = abs(stationNumber-[locB intValue]); 

NSLog(@"distanceA = %d", distanceA); 
NSLog(@"distanceB = %d", distanceB); 

if (distanceA < distanceB) { 
    return NSOrderedAscending; 
} else if (distanceA > distanceB) { 
    return NSOrderedDescending; 
} else { 
    return NSOrderedSame; 
} 


}]; 

NSLog(@"The contents of array = %@",[orderedPlaces description]); 

Блок работает, но не сортирует locationArray как предназначено. orderPlaces возвращает несортированные позицииArray. Запустив NSLOG на компонентах блока, я вижу, что он успешно распознает locationArray и создает объект расстояния. Я должен что-то пропускать, потому что я использую тот же код в другой части моего проекта, где я сравниваю locationArray с широким интервалом местоположения пользователя и работает хорошо. Пожалуйста, помогите мне определить проблему, не позволяя ей работать должным образом.

* Если вам нужна дополнительная информация или пояснения, просто спросите.

ответ

0

Я не понимаю ваш блок сортировки. Вы вычисляете расстояние A как abs (stationNumber- [locA intValue]).

Что такое StationNumber? Это какой-то фиксированный целочисленный индекс? Как разница между фиксированным номером станции и номерами станций в вашем массиве имеет отношение к расстояниям?

Мне кажется, что ваши значения расстояния должны быть (target.lat - this_station.lat)^2 + (target.long - this_station.long)^2

Это даст вам квадрат пифагорейское расстояние между вашей целевой точкой и одной из станций, которые вы сравниваете. Затем в вашем сравнении вы выбираете элемент, у которого квадрат расстояния меньше.

Вы можете пропустить квадратный корень, потому что вы просто сравниваете их. Это значительно ускорит расчет расстояний.

+0

Номер станции - это точная точка вдоль проезжей части, поэтому станция 10000 находится на расстоянии 100 футов от станции 10100, например. Единственный словарь, который мне действительно волнует, - это тот, кто находится ближе к входной станции, и я хочу, чтобы этот объект-словарь был первым (objectAtIndex: 0) в orderArray. Я использую значение расстояния, чтобы сравнить близость от введенной станции со всеми станциями в locationArray, так что ближайшая точка будет самой близкой. Значение abs означает, что большие отрицательные числа не ошибаются, чтобы быть ближайшими. Пожалуйста, несите меня на этом – user2621075

0

Попробуйте это:

NSArray *orderedPlaces = [CSVArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 

^(id a, id b) означает ^void (id a, id b) и ваше возвращаемое значение игнорируется.

+0

«^ (id a, id b) означает^void (id a, id b)« Нет, это не , Выводится тип возвращаемого значения. – newacct

+0

Правильно. Из http://clang.llvm.org/docs/BlockLanguageSpec.html: Тип возврата является необязательным и выводится из операторов return. Если операторы return возвращают значение, все они должны возвращать значение того же типа. Если возвращаемое значение не возвращается, выводимый тип блока недействителен; в противном случае это тип значения возвращаемого оператора. – sofacoder

Смежные вопросы