如何按最近距离对对象数组(纬度,经度)进行排序?

时间:2014-01-04 13:14:25

标签: ios objective-c arrays sorting latitude-longitude

我有一个来自核心数据的数组,我正在考虑如何按最近距离对数组进行排序:

for (int i=0; i<allTasks.count; i++) {
        id singleTask = allTasks[i];
        double latitude = [singleTask[@"latitude"] doubleValue];
        double longitude = [singleTask[@"longitude"] doubleValue];
    }

修改 当前位置与阵列中所有位置之间的距离。 我知道如何计算距离,我不知道如何对它们进行排序。

3 个答案:

答案 0 :(得分:2)

那么你想对你的allTask​​s数组进行排序吗?

最好的办法是为每个singleTask对象添加一个距离键/值对,并保持双NSNumber。

在第一遍中,循环遍历allTask​​s数组,获取每个纬度/经度,使用它创建CLLocation,并使用CLLocation方法distanceFromLocation:计算每个位置与目标(当前?)位置之间的距离。将结果保存到数组中的每个singleTask对象中。

一旦你的allTask​​s数组包含distance属性,只需使用sortUsingComparator之类的排序方法,根据距离值对数组进行排序。 (在sortUsingComparator方法系列中,您提供了一个比较器块,系统用它来比较对象对。然后在您的阵列上运行排序算法,使用比较器来决定排序顺序。

答案 1 :(得分:1)

您可以计算两个点之间的距离,例如this

你也可以尝试这个https://stackoverflow.com/a/9104926/3151066并定义一些计算距离的方法,以满足你作为比较运算符

答案 2 :(得分:1)

  1. 获取currentPosition的CLLocation(这是通过CLLocationManager完成的)

  2. 计算每个项目的距离,并将项目存储距离+项目作为字典中的一对

  3. 使用compare:selector

  4. 对字典allKeys数组进行排序

    所以

    CLLocation *current = ...;
    NSMutableDictionary *distsAndTasks [NSMutableDictionary dictionary];
    
    for(id task in allTasks) {
        CLLocation *taskLoc = [[CLLocation alloc] initWithLatitude:task.lat longitude:task.long];//!
        CLLocationDistance dist = [taskLoc distanceFrom:current];
        if(distsAndTasks[@(dist)]) {
            NSMutableArray *equidstants = [distsAndTasks[@(dist)] mutableCopy];
            [equidstants addObject:task]; 
            distsAndTasks[@(dist)] = equidstants; 
        }
        else {
            distsAndTasks[@(dist)] = @[task]; 
        }
    }
    
    NSArray *sortedDists = [distsAndTasks.allKeys sortedArrayUsingSelector:@selector(compare:)];
    
    //the tasks can now be access in a sorted way
    for(NSNumber *dist in sortedDists) {
        NSArray *tasksAtDistance = distsAndTasks[dist];
        NSLog(@"%@", tasksAtDistance);
    }