二阶使用斯威夫特
问题描述:
问题阵列是如下:二阶使用斯威夫特
我有两个阵列,一个与对象,第二个与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
使得代码更清晰这里,但如果你不熟悉它,你可能更喜欢显式循环。
谢谢Rob,现在更少的周期了!的确是一个算法问题,我在Swift上为“构建比较”构建跳跃,但仍然是,您的解决方案已经足够优化了。 – 2015-02-05 15:59:05