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
相关产品推荐
相关产品推荐

