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

Swift中高效合并同名Token并求和市值后排序的实现方法

高效合并同名Token并排序的Swift实现

这是个很常见的场景,用字典分组是最高效的实现方式之一——字典的键查找平均时间复杂度是O(1),整个分组过程只需要遍历一次数组,后续的合并和排序开销也会因为去重而降低。

下面是具体的实现步骤和代码,同时还优化了原代码里强制解包可能导致崩溃的问题:

步骤1:过滤无效数据

首先先过滤掉那些token为nil、token名称为空,或者quote无法转成Double的无效项,避免后续操作出现崩溃:

let validCoins = combinedCoinsFromAllWalles.filter {
    guard let token = $0.token, 
          let tokenName = token.name, 
          !tokenName.isEmpty,
          let quoteString = token.quote, 
          let _ = Double(quoteString) else {
        return false
    }
    return true
}

步骤2:按Token名称分组

利用Swift标准库的Dictionary(grouping:by:)方法,将有效Token按名称分组:

let groupedByName = Dictionary(grouping: validCoins) { coin in
    coin.token!.name! // 这里因为已经过滤过,所以可以安全解包
}

步骤3:合并每组的Quote值

遍历分组后的字典,将每组内所有Token的quote值相加,生成合并后的新Coin对象:

let mergedCoins = groupedByName.map { (tokenName, coinsInGroup) in
    // 计算当前组的总quote
    let totalQuote = coinsInGroup.reduce(0.0) { total, coin in
        total + Double(coin.token!.quote!)! // 过滤后确保能转成Double
    }
    
    // 创建合并后的Coin对象(这里假设你可以复用原有结构,替换quote为总值)
    var mergedCoin = coinsInGroup.first!
    var mergedToken = mergedCoin.token!
    mergedToken.quote = "\(totalQuote)"
    mergedCoin.token = mergedToken
    
    return mergedCoin
}

步骤4:按总Quote排序

最后对合并后的数组按总quote从大到小排序:

let sortedMergedCoins = mergedCoins.sorted {
    Double($0.token!.quote!) > Double($1.token!.quote!)
}

为什么这个方案高效?

  • 分组操作是**O(n)**时间复杂度(n是原始数组长度),字典的键查找几乎是瞬时的;
  • 合并操作是O(m)(m是去重后的Token名称数量),远小于n的话开销会大幅降低;
  • 排序操作是O(m log m),相比原方案的O(n log n),当重复Token较多时性能提升明显。

内容的提问来源于stack exchange,提问作者Arturo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:49:07