swift - 获取 2 个数组中的公共元素列表的性能
问题描述
我有两个自定义对象数组,它们有 id 和 sum。像这样:
let oldStakes = [Stake(id: 1, sum: 100), Stake(id: 2, sum: 120)]
let newStakes = [Stake(id: 5, sum: 600), Stake(id: 1, sum: 432)]
我需要获得两个具有相同 ID 的对象数组。如果我这样做:
newStakes = newStakes.filter{stake in oldStakes.contains{$0.id == stake.id}}.sorted{$0.id ?? 0 < $1.id ?? 0}
oldStakes = oldStakes.filter{stake in oldStakes.contains{$0.id == stake.id}}.sorted{$0.id ?? 0 < $1.id ?? 0}
这段代码的执行时间约为 2 秒。如何减少执行时间?谢谢!
解决方案
通常,搜索Set
是 O(1) 操作,并且在大多数情况下更快。
var oldStakes = [Stake(id: 1, sum: 100), Stake(id: 2, sum: 120)]
var newStakes = [Stake(id: 5, sum: 600), Stake(id: 1, sum: 432)]
let oldIds = Set(oldStakes.lazy.map{$0.id ?? 0})
let newIds = Set(newStakes.lazy.map{$0.id ?? 0})
newStakes = newStakes.filter{oldIds.contains($0.id ?? 0)}.sorted{$0.id ?? 0 < $1.id ?? 0}
oldStakes = oldStakes.filter{newIds.contains($0.id ?? 0)}.sorted{$0.id ?? 0 < $1.id ?? 0}
但我想知道你是否真的需要id
在你的Stake
.
推荐阅读
- mysql - 无论查询中的 where 子句如何,如何从表中获取 max(column_name)?
- php - PHP折扣功能
- yocto - iptables:无法指定 dport
- google-apps-script - DocumentApp openById 无效参数
- python - 我的程序无法以预期格式将输出写入文件
- postgresql - 带时区的时间戳(postgresql)
- mongodb - 网关端口后面的进程
- cytoscape - 将表格导入 cytoskape,导入标题但不导入数据
- android - 运行时的 Gradle 构建错误(Realm DB、android、kotlin)
- java - 如何防止 Spring 上下文关闭,直到集群 Quartz 作业未完成?[ 弹簧 + 石英 ]