我有两个自定义对象数组,分别具有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
设为可选。关于swift - 在2数组中获取常用元素列表的性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51458473/