我有一个自定义对象数组。并且对象具有包括纬度和经度的参数。我想根据它们与当前位置的距离对该数组进行排序。 我能够获得当前位置和每个对象之间的距离。但我不知道如何在计算距离后对其进行排序。 对于Eg:
MainArray = [{name:NYC, lat:1.11, lng:2.22}, {name:CAL, lat:3.33, lng:4.44}, {name:LA, lat:5.55, lng:6.66}].
所以,让我们说我在三个地方的中心,然后我想按附近的顺序对它们进行排序。对不起,如果上面的语法错误,因为我不能发布原始数据,因为它太大了。
我怎样才能做到这一点?请帮忙。
答案 0 :(得分:2)
与之前的答案几乎相同,但没有添加字段:
CLLocation *yourLocation = [[CLLocation alloc] initWithLatitude:.... longitude:...];
NSArray *array = @[@{ @"name": @"NYC", @"lat": @1.11, @"lng": @2.22}, @{@"name":@"CAL", @"lat":@3.33, @"lng":@4.44}, @{@"name":@"LA", @"lat":@5.55, @"lng":@6.66}];
array = [array sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2) {
CLLocation *location1 = [[CLLocation alloc] initWithLatitude:[obj1[@"lat"] double] longitude:[obj1[@"lng"] double]];
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:[obj2[@"lat"] double] longitude:[obj2[@"lng"] double]];
CLLocationDistance distance1 = [location1 distanceFromLocation:yourLocation];
CLLocationDistance distance2 = [location2 distanceFromLocation:yourLocation];
if (distance1 > distance2) {
return (NSComparisonResult)NSOrderedDescending;
}
if (distance1 < obj2 distance2) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];
答案 1 :(得分:0)
您可以在名为 distanceFromLocation 的对象中添加另一个字段。
然后在您需要显示距离之前,使用以下代码更新对象数组中的 distanceFromLocation 。
CLLocation *arrayCoord = [[CLLocation alloc] initWithLatitude:lat1 longitude:long1];
CLLocation *yourLocation = [[CLLocation alloc] initWithLatitude:yourLocationLat longitude:yourLocationLong];
CLLocationDistance distance = [arrayCoord distanceFromLocation:yourLocation];
之后使用排序描述符对对象数组进行排序
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"distanceFromLocation"
ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray = [arrayOfYourObjects sortedArrayUsingDescriptors:sortDescriptors];