iOS Swift过滤器和生成模型花费太多时间

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

我有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: [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)
    }