Arrays 在数组中找到正确的路径

Arrays 在数组中找到正确的路径,arrays,swift,filter,Arrays,Swift,Filter,我有一个不同货币的金额列表,我必须将其转换为欧元货币 我还有一系列表示各种汇率的对象,但并非所有货币都与欧元有直接汇率 例如: EUR - USD - 1.359 USD - EUR - 0.736 CAD - USD - 0.932 USD - CAD - 1.200 NTD - CAD - 0.345 在这个例子中,如果我想从NTD到EUR,我必须先做NTD->CAD,然后是CAD->USD,最后是USD->EUR 步骤的数量不是预先确定的,可以是一个或多个步骤来达到EUR 我怎样才能在S

我有一个不同货币的金额列表,我必须将其转换为欧元货币

我还有一系列表示各种汇率的对象,但并非所有货币都与欧元有直接汇率

例如:

EUR - USD - 1.359
USD - EUR - 0.736
CAD - USD - 0.932
USD - CAD - 1.200
NTD - CAD - 0.345
在这个例子中,如果我想从NTD到EUR,我必须先做NTD->CAD,然后是CAD->USD,最后是USD->EUR

步骤的数量不是预先确定的,可以是一个或多个步骤来达到EUR

我怎样才能在Swift 5中做到这一点?如果从一种货币到欧元只有一步之遥,我就能做到这一点,但如果还有更多,我就会迷失方向

编辑并添加一些代码

这是我的模型类中的对象“速率”:

struct Rate: Decodable {
    let curFrom: String
    let curTo: String
    let curRate: String

    enum CodingKeys: String, CodingKey {
        case curFrom = "from"
        case curTo = "to"
        case curRate = "rate"
    }
}
这就是我所做的功能,当时我认为我需要两个以上的步骤才能实现欧元:

func sumTransactions() -> Double {
        var total: Double = 0
        itemTransactions.forEach { (transaction) in
            if transaction.currency == "EUR" {
                if let amount = Double(transaction.amount) {
                    total += amount
                }
            } else {
                let foundRates = rates.filter({$0.curTo == "EUR" && $0.curFrom == transaction.currency})
                if foundRates.count > 0 {
                    if let amount = Double(transaction.amount), let rate = Double(foundRates.first!.curRate) {
                        total += amount * rate
                    }
                } else {
                    let foundAltRates = rates.filter({$0.curFrom == transaction.currency})
                    if foundAltRates.count > 0 {
                        let foundRates = foundAltRates.filter({$0.curTo == "EUR"})
                        if foundRates.count > 0 {
                            //
                        }
                    }
                }
            }
        }
        
        
        
        return total
    }

对象“交易”有两个属性:“金额”和“货币”。最后,我将不得不以欧元计算所有金额的总和。

基于将所有汇率转换为欧元可以简化当前问题的想法,我们从其他服务中获取汇率,并将汇率转换为欧元

enum Currencies: String {
    case euro = "EUR"
    case usd = "USD"
    ...
}

// * -> EUR
var simplifiedRates: [String: Double] = [Currencies.euro.rawValue: 1.0]
var fetchedRates: Set<Rate> = service.fetchRateSet()


for rate in fetchedRates {
    if rate.curTo == Currencies.euro.rawValue {
        simplifiedRates[rate.curFrom] = rate.curRate
        fetchedRates.remove(rate)
    }
}

while !fetchedRates.isEmpty {
    for rate in fetchedRates {
        if let existingRate = simplifiedRates[rate.curTo] {
            simplifiedRates[rate.curFrom] = existingRate * rate.curRate
            fetchedRates.remove(rate)
        }
    }
}
这样就可以整洁地编写
sumTransactions

func sumTransactions() -> Double { 
    var total: Double = 0
    for transaction in itemTransactions {
        total += simplifiedRates[transaction.currency] * transaction.amount
    }
    return total
}

你的密码在哪里?请添加汇率的定义以及您自己解决此问题的尝试?如果有不同的方法将一种货币转换为另一种货币,那么“正确路径”是什么?这不是一个快速的问题。您可能对“节点”、“树”以及如何从中找到值感兴趣。但通过多次预操作,可能会降低精度。这是一个非常经典的图形问题。节点是货币,它们之间的圆弧是要兑换的两种货币之间的汇率路径。你的汇率就像一个距离函数,所以你可以使用深度优先搜索来找到最便宜的汇率。您还可以将图形“压缩”为最小生成树,这样您就可以使用最小步骤数(但不一定是最佳速率)在任何支持的货币之间进行转换。如果我没有弄错,您的解决方案只有在转换需要中间步骤时才有效,例如USD->CAD->EUR(如果我们没有美元对欧元的直接汇率).问题是,我不知道将一种随机货币兑换成欧元需要多少步骤。因为我们正在迭代
fetchedRates
集,直到它变为空,任何最终可以转换成欧元的东西都会变平。例如,韩元->加元,加元->日元,日元->美元,美元->欧元都会变平。我会尝试一下,然后让我们继续你知道,谢谢。
> ["USD": 0.736, "CAD": 0.685952, "EUR": 1.0]
func sumTransactions() -> Double { 
    var total: Double = 0
    for transaction in itemTransactions {
        total += simplifiedRates[transaction.currency] * transaction.amount
    }
    return total
}