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

Posted

技术标签:

【中文标题】使用 Swift 对两个数组进行排序【英文标题】:Order two arrays using Swift 【发布时间】:2015-02-05 14:53:24 【问题描述】:

问题如下:

我有两个数组,一个包含对象,第二个包含按 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 更优化的解决方案?

【问题讨论】:

【参考方案1】:

这不是一个真正的 Swift 问题。这是一道算法题。你可以用任何语言做同样的事情。

首先,构建一个从 id 到 entity 的映射。然后,使用地图高效地查找实体。

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 上构建“排序比较”,但您的解决方案仍然使它足够优化。

以上是关于使用 Swift 对两个数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Swift:按排序描述符对数组进行排序

Swift 2.0 按属性对对象数组进行排序

使用日期 Swift 3 对字典数组进行排序

[PHP] 算法-数组归并排序并计算逆序对的个数的PHP实现

C语言:对输入的十个数进行从小到大排序

如何按相同的索引对两个数组进行排序?