问题如下:
我有两个数组,一个包含对象,第二个包含按 id 排序的 CoreData 实体:
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 到实体的映射。然后,使用 map 高效查找实体。
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
可以使代码更清晰,但如果您不熟悉它,您可能更喜欢显式循环。
关于ios - 使用 Swift 对两个数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28347058/