Ios 如何按最近距离对对象数组(纬度、经度)排序?

Ios 如何按最近距离对对象数组(纬度、经度)排序?,ios,objective-c,arrays,sorting,latitude-longitude,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];

我从核心数据中得到了一个数组,我在想如何按最近的距离对数组进行排序:

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

对于(int i=0;i可以计算两点之间的距离,如下所示


您也可以尝试此方法,并定义某种计算距离的方法,以满足您作为比较运算符的要求。

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


您也可以尝试此操作,并定义某种计算距离的方法,以满足您作为比较运算符的要求。那么,是否要对allTasks数组进行排序

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

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


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

那么您想对allTasks数组进行排序吗

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

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

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

  • 获取当前职位的CLLocation(通过CLLocationManager完成)

  • 计算每个项目的距离,并将距离+项目成对存储在字典中

  • 使用compare:selector对字典allKeys数组进行排序

  • 所以

  • 获取当前职位的CLLocation(通过CLLocationManager完成)

  • 计算每个项目的距离,并将距离+项目成对存储在字典中

  • 使用compare:selector对字典allKeys数组进行排序

  • 所以



    你首先做一件事,计算两个坐标之间的距离,用dict Contanin lat long和dist key将它们存储在数组中,然后用描述符将其缩短,计算距离并按其排序。你已经自己回答了你的问题。你在计算距离方面有问题吗?什么之间的距离……是的,有lat和通过这个你可以计算出当前lat longI编辑我的问题的距离。你做一件事首先计算两个cordinate之间的距离用dict Contanin lat long和dist键将它们存储在arra中,并存储在数组中,然后用描述符将其缩短计算距离并按其排序。你已经自己回答了你的问题。你知道吗ve计算距离有问题吗?什么之间的距离…是的,有lat和lon通过这个你可以计算当前lat的距离longI编辑了我的问题。不适用,因为他有两个字段,他必须混合才能获得距离Core数据不能在提取中使用CoreLocation;)是的,但在我链接的问题的一个答案中,描述了一种以标准方式对数组进行排序的方法,这样你就可以在这里定义一个复杂的条件来确定顺序,所以删除第一个链接..我担心答案是不连续的--而且我们甚至不知道他想要什么yet@Daij-Djan按照你现在建议的方式编辑我想我的答案是支架和应该足够了。不适用,因为他必须混合两个字段才能获得距离核心数据不能在获取中使用核心位置;)是的,但在我链接的问题的一个答案中,描述了一种以标准方式对数组进行排序的方法,这样你就可以在这里定义一个复杂的条件来确定顺序,所以删除第一个链接..我担心答案是不连续的--而且我们甚至不知道他想要什么yet@Daij-Djan按照你现在建议的方式编辑我想我的答案是stent and应该足够了Scalmer:100%内联编写,注意类型Device:将距离封装到任务对象本身。如果两个或多个任务的距离相等,则此操作将失败。@Daij Djan将距离存储到任务对象中其他不相关的点可能不合逻辑。例如
    distance to mething
    ?错误。或
    distanceToCurrent
    ?这需要实时更新。不。字典是一个很好的解决方案,但我会使用任务作为键,使用距离作为值,所以复制不会有问题。@Daij Djan如果它不支持复制,那么你可以使用一些任务标识符,甚至是它的
    散列
    。或者
    [NSMapTable STRONGTRONGOBJECTS可接受]
    :)免责声明:100%内联编写,注意类型缺陷:将距离封装到任务对象本身。如果两个或多个任务的距离相等,则此操作将失败。@Daij Djan在任务对象中存储到其他无关点的距离可能不符合逻辑。例如
    距离到测量值
    ?错误。或者
    距离到当前值
    ?这将导致ld需要实时更新。不需要。字典是一个很好的解决方案,但我会使用任务作为键,使用距离作为值,所以重复项不会有问题。@Daij Djan如果它不支持复制,那么您可以使用一些任务标识符
    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);
    }