You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

高频更新场景下按键排序字典并转换为数组的实现问询

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:38:41