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
}