swift找到数组中的第2和第3个最小数字 -

时间:2018-02-17 00:01:50

标签: swift

下面我有一个城市列表,我将用户的当前位置与城市进行比较并使用(最小)功能

let closestCity = min(theDistanceInMetersFromBusselton,theDistanceInMetersFromBunbury,theDistanceInMetersFromJoondalup,theDistanceInMetersFromArmadale)

返回最近的城市,但现在我想返回第二个和第三个最近的城市。

虽然我正在考虑以下方面的事情,但我还没有能够让它工作:

citiesArray - closestCity = SecondClosestCitiesArray 

然后执行secondClosestCity = min(SecondClosestCitiesArray)以获得第二个最近的城市。

然后重复这个以找到第三个最近的?

有什么想法吗?

extension HomePage {
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {
        let db = Firestore.firestore()

        guard let uid = Auth.auth().currentUser?.uid else { return }

        let location = locations[0]
        let actualLatitude = String(location.coordinate.latitude)
        let actualLongitude = String(location.coordinate.longitude)

        guard let doubleActualLatitude = Double(actualLatitude) else { return }

        guard let doubleActualLongitude = Double(actualLongitude) else { return }

        ///users current location
        let usersCurrentLocation = CLLocation(latitude: doubleActualLatitude, longitude: doubleActualLongitude)

        //////////////list of locations ////////////////

        //////////ARMADALE/////////////////////

        let ArmadaleLatitude = Double(-32.1530)
        let ArmadaleLongitude = Double(116.0150)

        let ArmadaleCoordinates = CLLocation(latitude:ArmadaleLatitude, longitude: ArmadaleLongitude)

        let theDistanceInMetersFromArmadale = usersCurrentLocation.distance(from: ArmadaleCoordinates)

        ////////////////Bunbury///////////////////
        let BunburyLatitude = Double(-33.3256)
        let BunburyLongitude = Double(115.6396)

        let BunburyCoordinates = CLLocation(latitude:BunburyLatitude, longitude: BunburyLongitude)

        let theDistanceInMetersFromBunbury = usersCurrentLocation.distance(from: BunburyCoordinates)

        /////////////////////////////////////////////

        ////////Busselton//////////////////
        let busseltonLatitude = Double(-33.6555)
        let busseltonLongitude = Double(115.3500)

        let busseltonCoordinates = CLLocation(latitude:busseltonLatitude, longitude: busseltonLongitude)

        let theDistanceInMetersFromBusselton = usersCurrentLocation.distance(from: busseltonCoordinates)
        /////////////////////////////////

        /////////Joondalup////////////////////
        let JoondalupLatitude = Double(-32.5361)
        let JoondalupLongitude = Double(115.7424)

        let JoondalupCoordinates = CLLocation(latitude:JoondalupLatitude, longitude: JoondalupLongitude)

        let theDistanceInMetersFromJoondalup = usersCurrentLocation.distance(from: JoondalupCoordinates)

        //////////////////////////////////////

        /////return the the closest city
        let closestCity = min(theDistanceInMetersFromBusselton,theDistanceInMetersFromBunbury,theDistanceInMetersFromJoondalup,theDistanceInMetersFromArmadale)

        func findClosestCity(){
            //////////Armadale////////////////////////
            if closestCity == theDistanceInMetersFromArmadale{
                db.collection("Users").document(uid).setData(["Location": "Armadale" ], options: SetOptions.merge())

            /////////Bunbury////////////
            }else if closestCity == theDistanceInMetersFromBunbury{
                let Bunbury = "Bunbury"

                db.collection("Users").document(uid).setData(["Location": Bunbury ], options: SetOptions.merge())

            ///////////// Busselton//////////////
            }else if closestCity == theDistanceInMetersFromBusselton{
                let Busselton = "Busselton"

                db.collection("Users").document(uid).setData(["Location": Busselton ], options: SetOptions.merge())

            /////////////Joondalup//////////////////
            }else if closestCity == theDistanceInMetersFromJoondalup{
                db.collection("Users").document(uid).setData(["Location": "Joondalup" ], options: SetOptions.merge())
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

let cityLocations = [
    "Armadale": CLLocation(latitude: -32.1530, longitude: 116.0150),
    "Bunbury": CLLocation(latitude: -33.3256, longitude: 115.6396),
    "Busselton": CLLocation(latitude: -33.6555, longitude: 115.3500),
    "Joondalup": CLLocation(latitude: -32.5361, longitude: 115.7424)
]

func distanceFromCity(_ city: String, location: CLLocation) -> Double? {
    return cityLocations[city].flatMap { location.distance(from: $0) }
}

func citiesClosestToLocation(_ location: CLLocation, n: Int) -> [String] {
    let cities = cityLocations.sorted {
        location.distance(from: $0.value) < location.distance(from: $1.value)
    }
    return cities.dropLast(cities.count - n).map({ $0.key })
}

let testLocation = cityLocations["Armadale"]!

print(citiesClosestToLocation(testLocation, n: 3)) // ["Armadale", "Joondalup", "Bunbury"]

答案 1 :(得分:0)

您可以将这些值添加到数组中,并在添加数据时确保它们已添加到排序顺序中。任何给定点的数组将为您提供第一个索引上最接近的城市和第二个索引上的第二个最接近的城市。

以下是一个例子:

extension Array where Element == Double {
    mutating func appendSorted(_ element: Double) {
        if self.count == 0 {
            self.append(element)
            return
        }
        for i in 0..<self.count {
            if element < self[i] {
                self.insert(element, at: i)
                return
            }
        }
        self.append(element)
    }
}