2015-02-05 77 views
2

問題陣列是如下:二階使用斯威夫特

我有兩個陣列,一個與對象,第二個與CoreData實體通過IDS分類:

var objects = [["id":5],["id":1],["id":3]] 
var entities = [["id":1],["id":3],["id":5]] 

我需要在實體排序與對象的順序相同。 *實體宗旨保存尚

我能做到這一點,通過在一個循環迴路,並創建第三個數組,但它是緩慢和使用更多的內存比它應該(我的陣列有時會處理超過100個單位)

let count = objects.count 
var finalArray = []() 
for i in 0..<count { 
    let id = objects[i].id 
    for k in 0..<count { 
     if entities[k].id == id { 
      finalArray += [entities[k]] 
      break 
     } 
    } 
} 

上面的代碼確實有效,但它聞起來不夠好。任何建議如何使用內置的Swift更優化的解決方案?

回答

3

這不是一個真正的Swift問題。這是一個算法問題。你可以用任何語言以相同的方式進行操作。

首先,建立一個從id到實體的映射。然後,使用地圖高效查找實體。

var entityForId = [Int:MyEntity]() 
for entity in entities { 
    entityForId[entity.id] = entity 
} 

var finalArray = [MyEntity]() 
for object in objects { 
    if let entity = entityForId[object.id] { 
     finalArray.append(entity) 
    } 
} 

您可以用單行更換第二環:

var finalArray = objects.flatMap({ entityForId[$0.id] }) 

我發現使用flatMap使得代碼更清晰這裏,但如果你不熟悉它,你可能更喜歡顯式循環。

+0

謝謝Rob,現在更少的週期了!的確是一個算法問題,我在Swift上爲「構建比較」構建跳躍,但仍然是,您的解決方案已經足夠優化了。 – 2015-02-05 15:59:05