高频更新场景下按键排序字典并转换为数组的实现问询
Hey,刚好碰到过类似的高频更新场景,给你梳理一套完整的实现方案,完美适配你的需求!
核心思路拆解
你的选择非常合理:用字典存储保证高频更新的效率(O(1)操作),需要遍历凑量时再将字典按价格排序转为数组。下面分步骤给你具体实现代码(以Swift为例,毕竟你提到了Codable):
1. 定义Codable数据模型
先把传入的JSON数组解析成结构化数据,方便后续更新字典:
// 对应JSON里的单个价格-数量条目 struct PriceQuantityEntry: Codable { let price: Double let quantity: Int }
注意:如果是货币场景,强烈建议用
Decimal替代Double,避免浮点数精度丢失,后面的代码可以直接替换类型。
2. 高频更新字典的逻辑
每次收到JSON数据后,解析成数组再批量更新字典——字典的updateValue/下标操作都是O(1),比数组操作高效太多:
// 全局/类级别的字典存储,key是价格,value是对应数量 var priceQuantityStore: [Double: Int] = [:] func updateStore(with jsonData: Data) { do { // 解析JSON数组为模型数组 let newEntries = try JSONDecoder().decode([PriceQuantityEntry].self, from: jsonData) // 遍历更新字典:已有价格则累加数量,没有则直接设置 for entry in newEntries { priceQuantityStore[entry.price, default: 0] += entry.quantity } } catch { print("JSON解析失败:\(error.localizedDescription)") } }
3. 字典转排序数组(升序/降序)
当需要按价格顺序遍历的时候,把字典的键值对转成数组并排序,这里直接返回元组数组方便后续使用:
// 按价格升序排序(从低价到高价) func getSortedAscending() -> [(price: Double, quantity: Int)] { return priceQuantityStore.sorted { $0.key < $1.key } } // 按价格降序排序(从高价到低价) func getSortedDescending() -> [(price: Double, quantity: Int)] { return priceQuantityStore.sorted { $0.key > $1.key } }
如果用
Decimal类型,排序逻辑改成$0.key.compare($1.key) == .orderedAscending即可。
4. 按价格顺序凑总数量的示例
比如你要凑够目标总数量targetTotal,从低到高依次取量的实现:
func accumulateToTarget(targetTotal: Int) -> [(price: Double, quantityUsed: Int)] { let sortedItems = getSortedAscending() var remainingQuantity = targetTotal var resultList: [(price: Double, quantityUsed: Int)] = [] for item in sortedItems { guard remainingQuantity > 0 else { break } // 取当前价格下能使用的最大数量(不超过剩余需求) let usedQuantity = min(item.quantity, remainingQuantity) resultList.append((price: item.price, quantityUsed: usedQuantity)) remainingQuantity -= usedQuantity } return resultList }
额外优化建议
- 如果更新频率极高,可以考虑加个读写锁(比如
NSLock或者os_unfair_lock),避免多线程更新字典出现线程安全问题; - 若价格是整数或固定精度的小数,也可以把价格转成
Int(比如把元转成分)作为字典key,进一步提升哈希效率。
内容的提问来源于stack exchange,提问作者Nevin Jethmalani
相关产品推荐
相关产品推荐

