ios - 使用 Swift 对两个数组进行排序

标签 ios arrays sorting swift core-data

问题如下:

我有两个数组,一个包含对象,第二个包含按 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/

相关文章:

c++ - 如何按降序排序?

javascript - 按对象中的 ng-repeat (key, value) 对中的值排序

android - 如何在 Swift 中将 protobuf 对象转换为 ByteArray 并使用 Base64 URL_SAFE 进行编码?

ios - 如何更改后退按钮上的文字

java - 无法将 int[] 转换为 int

c - 在没有 Malloc 的情况下分配结构数组?

iphone - CISourceOverCompositing 在设备和模拟器中产生不同的结果

ios - Swift ios 推送通知通知在应用程序打开时不工作,但在应用程序关闭时工作

arrays - 如何将Julia数组的数据类型从 “Any”更改为 “Float64”?

arrays - 具有重复值的 2sum