我有一个来自核心数据的数组,我正在考虑如何按最近距离对数组进行排序:
for (int i=0; i<allTasks.count; i++) {
id singleTask = allTasks[i];
double latitude = [singleTask[@"latitude"] doubleValue];
double longitude = [singleTask[@"longitude"] doubleValue];
}
修改 当前位置与阵列中所有位置之间的距离。 我知道如何计算距离,我不知道如何对它们进行排序。
答案 0 :(得分:2)
那么你想对你的allTasks数组进行排序吗?
最好的办法是为每个singleTask对象添加一个距离键/值对,并保持双NSNumber。
在第一遍中,循环遍历allTasks数组,获取每个纬度/经度,使用它创建CLLocation,并使用CLLocation方法distanceFromLocation:计算每个位置与目标(当前?)位置之间的距离。将结果保存到数组中的每个singleTask对象中。
一旦你的allTasks数组包含distance属性,只需使用sortUsingComparator之类的排序方法,根据距离值对数组进行排序。 (在sortUsingComparator方法系列中,您提供了一个比较器块,系统用它来比较对象对。然后在您的阵列上运行排序算法,使用比较器来决定排序顺序。
答案 1 :(得分:1)
您可以计算两个点之间的距离,例如this
你也可以尝试这个https://stackoverflow.com/a/9104926/3151066并定义一些计算距离的方法,以满足你作为比较运算符
答案 2 :(得分:1)
获取currentPosition的CLLocation(这是通过CLLocationManager完成的)
计算每个项目的距离,并将项目存储距离+项目作为字典中的一对
使用compare:selector
所以
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);
}