swift - Swift - 在字典中按天分组数据
问题描述
这是字典:
[1549424985: ["amount": "10.0", "symbol": "XRP"], 1546531017: ["amount": "1.0", "symbol": "ETH"], 1549424153: ["amount": "50.0", "symbol": "EOS"], 1546531031: ["amount": "200.0", "symbol": "XRP"]]
typealias CryptoTuple = (symbol: String, amount: Double)
var cryptosPerDay = [String: [CryptoTuple]]()
var prev = ""
groupedData.keys.sorted(by: <).forEach( { key in
let date = parseToDateString(key)
if let buy = groupedData[key], let symbol = buy["symbol"], let amountStr = buy["amount"], let amount = Double(amountStr) {
if prev != date {
cryptosPerDay[date] = [(symbol, amount)]
if let old = cryptosPerDay[prev] {
cryptosPerDay[date]?.append(contentsOf: old)
}
prev = date
} else {
cryptosPerDay[date]?.append((symbol, amount))
}
}
})
这是我上一个问题的答案提供的代码:Calculating doubles by dates with format timeIntervalSince1970 from 2 different dictionaries
但是这段代码返回我重复的值 print(cryptosPerDay)
["2019-02-06": [(symbol: "EOS", amount: 50.0), (symbol: "ETH", amount: 1.0), (symbol: "XRP", amount: 200.0), (symbol: "XRP", amount: 10.0)], "2019-01-03": [(symbol: "ETH", amount: 1.0), (symbol: "XRP", amount: 200.0)]]
如何解决?
解决方案
目前尚不清楚目标是什么,但这里有一种方法可以做我认为你正在尝试做的事情。注意使用结构而不是元组:
let d = [ // your data
1549424985: ["amount": "10.0", "symbol": "XRP"],
1546531017: ["amount": "1.0", "symbol": "ETH"],
1549424153: ["amount": "50.0", "symbol": "EOS"],
1546531031: ["amount": "200.0", "symbol": "XRP"]
]
struct Trade {
let amount:Double
let symbol:String
}
var result = [String:[Trade]]()
for key in d.keys {
let date = Date(timeIntervalSince1970: Double(key))
let f = DateFormatter()
f.dateFormat = "yyyy-MM-dd"
let dayString = f.string(from: date)
let val = d[key] as! [String:String]
let trade = Trade(
amount: Double(val["amount"]!)!,
symbol: val["symbol"]!
)
result[dayString, default:[]].append(trade)
}
之后,result
就是:
["2019-02-06": [Trade(amount: 10.0, symbol: "XRP"), Trade(amount: 50.0, symbol: "EOS")],
"2019-01-04": [Trade(amount: 1.0, symbol: "ETH"), Trade(amount: 200.0, symbol: "XRP")]]
...这似乎是“正确”的答案。就个人而言,我认为以这种方式使用日期字符串很愚蠢。最好使用实际日期。在这种情况下,最后一部分可以重写为:
var result = [Date:[Trade]]()
for key in d.keys {
let date = Date(timeIntervalSince1970: Double(key))
let day = Calendar(identifier: .gregorian).startOfDay(for: date)
let val = d[key] as! [String:String]
let trade = Trade(
amount: Double(val["amount"]!)!,
symbol: val["symbol"]!
)
result[day, default:[]].append(trade)
}
推荐阅读
- java - 如何在 Eclipse 中手动配置 Glassfish 6 服务器
- angular - 为什么 Mat-table 会失去它的样式?
- node.js - 如何检查更新的文档是否真的被修改了?
- c# - 每个类获得一个 Roslyn 语法接收器
- python - 如何记录两个断点之间的调用堆栈?
- javascript - onChange 中 e(事件接口)的第二个参数 = (type) => (e) => 这是如何从 OnChange 传递的(默认情况下)
- c++ - 代码在第 51 个输入时失败,测试用例 2。可能是什么问题?
- angular - 摆脱 Angular 中的循环依赖
- python - python中`__slots__`的静态类型
- ios - 在 UITableView 的不同部分显示不同的行