iOS Swift过滤器和生成模型花费太多时间
我有3个模型和各自的阵列iOS Swift过滤器和生成模型花费太多时间,ios,arrays,swift,algorithm,Ios,Arrays,Swift,Algorithm,我有3个模型和各自的阵列 struct A { var id: String var bId: String var cId: String } struct B { var id: String } struct C { var id: String } let aList: [A] = [.......] // 100 elements let bList: [B] = [.......] // 200 elements let cList
struct A {
var id: String
var bId: String
var cId: String
}
struct B {
var id: String
}
struct C {
var id: String
}
let aList: [A] = [.......] // 100 elements
let bList: [B] = [.......] // 200 elements
let cList: [C] = [.......] // 300 elements
现在我需要结构'FilterModel'的对象数组,该数组将通过迭代'aList'从'bList'和'cList'进行过滤
struct FilterModel {
var objA: A
var objB: B?
var objC: C?
init(objA: A,
objB: B? = nil,
objC: C? = nil) {
self.objA = objA
self.objB = objB
self.objC = objC
}
}
So far i have tried like this
var filterModels: [FilterModel] = []
for aModel in aList {
let filterBModel = bList.filter { $0.id == aModel.bId }.first
let filterCModel = cList.filter { $0.id == aModel.cId }.first
let model = FilterModel(objA: aModel,
objB: filterBModel,
objC: filterCModel)
filterModels.append(model)
}
有没有什么优化的或更好的方法,因为它花费了太多的时间?因为
aList
的每次迭代都必须在两个列表上迭代,所以复杂性不好。而是首先生成索引:
var bIndex: [String: B] = [:]
bList.forEach {
bIndex[$0.id] = $0
}
var cIndex: [String: C] = [:]
cList.forEach {
cIndex[$0.id] = $0
}
let filterModels: [FilterModel] = aList.map { aModel in
return FilterModel(
objA: aModel,
objB: bIndex[aModel.bId],
objC: cIndex[aModel.cId]
)
}
如果记录是通过API来的。我希望您对回复使用分页
带紧映射
let finalList = aList.compactMap { a -> FilterModel in
let b = bList.first(where: { $0.id == a.id })
let c = cList.first(where: { $0.id == a.id })
return FilterModel(objA: a, objB: b, objC: c)
}
首先,将
bList.filter{$0.id==aModel.bId}.First
更改为bList.First{$0.id==aModel.bId}
。但是性能无论如何都会很糟糕。从哪里获得bList和cList阵列?您正在创建它们吗?在A.bId
和B.id
之间是否存在任何关系?@LalKrishna:在我的代码中已经提到了每个不可用分页的地方,因此在这种情况下,应该有一个解决方案,我们不能使用compactMap
(前面的名称为flatMap
)不使用forEach?@RameswarPrasad是的,你也可以使用压缩映射。让finalList=aList.compactMap{a->FilterModel在let b=bList.first(其中:{$0.id==a.id})中让c=cList.first(其中:{$0.id==a.id})返回FilterModel(objA:a,objB:b,objC:c)@ajayinghmehra Correct。这样,它将finalList
作为一个常量,并扩展了更多的功能编码。:)
let finalList = aList.compactMap { a -> FilterModel in
let b = bList.first(where: { $0.id == a.id })
let c = cList.first(where: { $0.id == a.id })
return FilterModel(objA: a, objB: b, objC: c)
}