swift - 在iOS swift中高效地交叉对象数组而不使用for循环
问题描述
我想相交两个包含“人”对象的数组,每个数组的数组大小可能超过 10000,我想使用对象的“id”相交而不使用 for 循环。我已经使用 for loop 我的解决方案,但速度很慢。一些 People 对象在两个数组中可以有相同的“id”,而一些对象可以有不同的“id”。
下面是我的代码示例
例子 :
class People {
var id:Int!
var name:String!
}
let object1 = People(10, John)
let object2 = People(5, Rocky)
let array1 = [object1, object2, .... , object10000]
let array2 = [objectA1, objectA2, .... , objectA10000]
解决方案
您可以使用 PeopleIds 创建 Set 并使用 Object Id 创建 Set,如下所示:
let peoples = ...
let objects = ...
let peoplesIds = peoples.map { $0.id }
let objectsIds = objects.map { $0.id }
let peoplesIdsSet = Set(peoplesIds)
let objectsIdsSet= Set(objectsIds)
let intersectionsIds = Array(peoplesIdsSet.intersection(objectsIdsSet))
另外,我建议您将其放在后台线程中,如下所示:
DispatchQueue.global(qos: .background).async {
findIntersecionsIds()
DispatchQueue.main.async {
// done
}
}
推荐阅读
- elasticsearch - 如何在 Kibana 中使用可视化执行动态查询
- javascript - 在 Servlet 运行时使用 AJAX 在 JSP 中填充 DOM 元素?
- jvm - JDK Mission Control (JMC) 中的 HeapMemoryUsagePercent 是如何计算的?
- shell - 无法在 GCP 控制台上获取操作系统策略分配的合规状态
- build - Yocto - 将一个配方生成的文件复制到另一个配方 yocto
- c++ - 在 Ubuntu 20.04 上使用 nana 库时的链接器问题
- php - 无法从 magento 的导出页面下载产品 CSV 文件
- php - htaccess重写规则知识
- firebase - 使用 Firestore 作为数据库,如何在没有自由文本搜索的情况下向用户提供多个数据过滤器?
- r - R 用于搜索大型数据集的 for 循环的替代方案