Сортировать массив объектов по одному из их параметра Double - PullRequest
0 голосов
/ 29 августа 2018

Я делаю приложение, где в табличном представлении я хочу показать пользователю места от ближайшего к дальнему. Я использую эту функцию для расчета расстояния между местоположением пользователя и этими местами:

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 голосов
/ 29 августа 2018

Вычисление расстояния между широтой / длинной парой довольно трудоемко. Ваш код повторяет это преобразование дважды для каждого сравнения. Не делай этого. Для действительно хорошего алгоритма сортировки, который будет преобразовывать ваши пары широта / длинна в расстояния примерно 2 • n • log (n) раз

Является ли ваше var distanceToUsersCurrentLocation свойством объектов в вашем массиве? Если так, измените это, чтобы быть ленивым var. Таким образом, он будет вычислен в первый раз, когда вам это понадобится, а затем будет рассматриваться как константа.

Чтобы использовать отложенную переменную, ваш объект должен быть классом, а не структурой (ссылочным типом, а не типом значения.)

Если ваш объект данных является структурой и вы не можете изменить его на класс, вам может потребоваться сопоставить ваш массив структур с массивом кортежей типа (Chantier, Double), отсортировать массив кортежей и карты этот результирующий массив возвращает массив объектов Chantier

...