按多个键值对数据进行排序

Posted

技术标签:

【中文标题】按多个键值对数据进行排序【英文标题】:Sorting data by multiple key values 【发布时间】:2015-07-07 19:39:03 【问题描述】:

我有一个基本列表应用程序,其中包含两个实体 FolderItem 具有一对多关系,文件夹子类有一个名为 itemsArray() 的函数,它返回排序数组中的 Items通过creationDate 显示UITableView

Item 有两个属性称为date,类型为NSDate,另一个属性为bool,称为completed。我创建了一个函数,可以在其中将单元格项目对象标记为已完成,这会将单元格文本颜色更改为灰色。

有没有办法也可以按其完成值对其进行排序?例如,completed 的值 true 或 false 应该分隔所有已完成的项目,然后还按 creationDate 对其进行排序。

最终结果应该是已完成项目位于UITableView 底部的位置,并且按日期顺序排列,未完成项目按日期顺序排列。好像完成的优先级高于日期,但仍按创建日期排序

这是我当前使用排序描述符返回数组的函数;

func itemsArray() -> [Item] 
    let sortDescriptor = NSSortDescriptor(key: "creationDate", ascending: true)
    return checklist.sortedArrayUsingDescriptors([sortDescriptor]) as! [Item]

PS:我尝试了一些变通方法,例如将日期标记为已完成更新,因此它位于底部。这将已完成的项目与未完成的项目分开。但是,当取消标记该项目时,它仍保留在底部,这也不是一个好的长期解决方案,因为我可能想将排序更改为按字母顺序和完成。

【问题讨论】:

【参考方案1】:

您可以在函数中添加另一个NSSortDescriptor

func itemsArray() -> [Item] 
    let sortByCompleted = NSSortDescriptor(key: "completed", ascending: true)
    let sortByCreationDate = NSSortDescriptor(key: "creationDate", ascending: true)
    return checklist.sortedArrayUsingDescriptors([sortByCompleted, sortByCreationDate]) as! [Item]

使用ascending 值首先获得true 或首先获得false。或者 Swifty 的做事方式:

func itemsArray() -> [Item] 
    return checklist.sort 
        if $0.completed == $1.completed 
            return $0.creationDate < $1.creationDate
        
        return $0.completed < $1.completed
    

【讨论】:

谢谢!我非常感谢这种快速的方式,我是 ios 新手,并且一直在尝试熟悉闭包。结果实际上分为三个完成组,然后意识到我在添加时从未设置过“false”值,因此在修复您的方法完美运行后,项目实际上具有默认值 nil (Y)

以上是关于按多个键值对数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章

java 怎么样获取Map中第几个键值对

如何按值对 LevelDB 进行排序

php如何按数组键值排序?

如何使用优先队列根据键值对的值进行排序

根据嵌套键值对对象数组进行排序的最快方法

按 2 级深的键值关系对 NSArray 进行排序