按其Double参数之一对对象数组进行排序

时间:2018-08-29 01:25:50

标签: ios swift sorting double

我正在制作一个应用程序,其中我想在表视图中向用户显示从最近到最远的位置。我正在使用此功能来计算用户位置和这些位置之间的距离:

var distanceToUsersCurrentLocation: Double {
    let manager = CLLocationManager()
    let destinationCoordinates = CLLocation(latitude: (self.getLat() as NSString).doubleValue, longitude: (self.getLon() as NSString).doubleValue)
    let selfCoordinates = CLLocation(latitude: (manager.location?.coordinate.latitude)!, longitude: (manager.location?.coordinate.longitude)!)
    return selfCoordinates.distance(from: destinationCoordinates) 

现在要对数组进行排序,我正在使用此函数:

self.ListeChantiers?.sort(by: {ji,jij in ji.distanceToUsersCurrentLocation.isLess(than:jij.distanceToUsersCurrentLocation)})

这是可行的,但问题是它占用了太多时间。有人可以告诉我这是强制性的还是有更快的解决方案? 感谢您的阅读(也许有帮助)!

1 个答案:

答案 0 :(得分:2)

计算经纬度之间的距离非常耗时。您的代码为每个比较重复两次该转换。不要那样做对于一个非常好的排序算法,它将纬度/经度对转换为大约2•n•log(n)倍的距离

您的var distanceToUsersCurrentLocation是数组中对象的属性吗?如果是这样,请将其更改为惰性变量。这样,它将在您第一次需要它时进行计算,然后在以后将其视为常量。

要使用惰性变量,您的对象将需要是一个类,而不是结构(引用类型,而不是值类型)。

如果数据对象是一个结构,并且不能将其更改为类,则可能需要将结构数组映射到类型(Chantier,Double)的元组数组,对元组数组和映射进行排序得到的数组将返回Chantier对象数组