二阶使用斯威夫特

问题描述:

问题阵列是如下:二阶使用斯威夫特

我有两个阵列,一个与对象,第二个与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更优化的解决方案?

这不是一个真正的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