Использование блока sortedArrayUsingComparator:^(id a, id b)
В моем проекте я пытаюсь сравнить известное местоположение с введенным местоположением, используя блок sortedArrayUsingComparator:^(id a, id b). У меня есть словарь массив с именем locationArray, содержащий широту и номер станции, которая соответствует этой точке. Я пытаюсь сравнить каждую станцию locationArray с введенной станцией. Я делаю это, беря абсолютную величину разницы между двумя, что дает мне расстояние. Затем я пытаюсь отсортировать locationArray по расстоянию от введенной станции от ближайшей к дальней.
//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;
}, ...
Мой код блока, который следует непосредственно за locationArray.
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]);
Блок запускается, но он не сортирует массив Array, как предполагалось. orderPlaces возвращает несортированный массив LocationArray. Запустив NSLOG для компонентов блока, я вижу, что он успешно распознает locationArray и создает объект расстояния. Я должен что-то упустить, потому что я использую один и тот же код в другой части моего проекта, где я сравниваю locationArray с последним значением местоположения пользователя, и это работает хорошо. Пожалуйста, помогите мне определить проблему, не позволяя ей работать как задумано.
* Если вам нужна дополнительная информация или разъяснения, просто спросите.
2 ответа
Я не понимаю ваш блок сортировки. Вы вычисляете расстояние A как abs(stationNumber-[locA intValue]).
Что такое stationNumber? Это какой-то фиксированный целочисленный индекс? Как разница между фиксированным номером станции и номерами станций в вашем массиве может иметь какое-либо отношение к расстояниям?
Мне кажется, что ваши значения расстояния должны быть (target.lat - this_station.lat)^2 + (target.long - this_station.long)^2
Это даст вам квадрат пифагорейского расстояния между вашей целевой точкой и одной из станций, которые вы сравниваете. Затем в своем сравнении вы выбираете пункт, у которого квадрат расстояния меньше.
Вы можете пропустить квадратный корень, потому что вы просто сравниваете их. Это сделает ваши расчеты расстояния намного быстрее.
Попробуй это:
NSArray *orderedPlaces = [CSVArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
^(id a, id b)
средства ^void (id a, id b)
и ваше возвращаемое значение игнорируется.