gpt4 book ai didi

swift - 匹配集合中的元素,不同类型,公共(public)元素

转载 作者:行者123 更新时间:2023-11-28 05:59:48 26 4
gpt4 key购买 nike

我有两个集合(例如,SetArray)。每个都有一个不同类型的Object/Struct,但都有一些主键

struct A {
var name: String
var primaryID: Int
}

class B {
var kind: String
var primaryID: Int
}

我有这些收藏:

var setOfA: Set<A>
var arrayOfB: Array<B>

我需要用 setOfA 的值更新 arrayOfB。例如遍历 arrayOfB,从 setOfA(其中 primaryID 相等)获取元素并更新 arrayOfB

看起来像:

for bElement in arrayOfB {
let a = setOfA.first(where: { $0.primaryID == bElement.primaryID })
bElement.kind = a.name // Just an example
}

如果 first(where:) 的效率是 O(n)(我真的不知道),上面的代码是 O(n^2)(假设两个集合的长度相同).

我能想到的一件事是删除我获取的 set 的每个元素,从而将内部循环减少一半。

有更好的方法吗?

最佳答案

是的,first(where:)遍历集合直到匹配找到元素,因此您的方法的复杂性受到限制数组元素个数与集合元素个数的乘积

这就是我要做的:首先创建一个字典,映射每个setOfA 中相应元素的主要 id:

var idToA: [Int: A] = [:]
for a in setOfA {
idToA[a.primaryID] = a
}

然后遍历arrayOfB,在字典中查找id,更新必要时的元素:

for b in arrayOfB {
if let a = idToA[b.primaryID] {
b.kind = a.name
}
}

这需要对 setOfAarrayOfB 进行一次遍历,加上字典查找。 (如果字典查找速度很快 key 散列上几乎没有冲突,情况就是这样整数键。)

关于swift - 匹配集合中的元素,不同类型,公共(public)元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50187612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com