ios - 按月对数据进行排序

标签 ios swift sorting

我正在使用

 self.alldata = self.alldata?.sorted { $0.Edate < $1.Edate }

上面的代码为我提供了按日期排序的数据。但是我如何按月对数据进行排序。这是我在表格 View 中填充的来自服务器的完整日期响应

12-12-2017 09:12:45

如何按月排序?

最佳答案

对于这些特定类型的排序,您可能希望将 EDate 属性拆分为属性组件并使用复合排序描述符 (NSSortDescriptor)。排序描述符可能很有用,尤其是当您计划优先排序要用于对对象进行排序的键时。它允许您引入主要和次要的排序标准,这有时非常有用。

考虑以下示例:

1。从 NSObject 派生对象并将日期拆分为组件

class MyObject : NSObject {
    @objc dynamic var dateYear : Int
    @objc dynamic var dateMonth : Int
    @objc dynamic var dateDay : Int

    // add Hour or Weekday if needed

    init(dateYear: Int, dateMonth: Int, dateDay: Int) {
        self.dateYear = dateYear
        self.dateMonth = dateMonth
        self.dateDay = dateDay
    }
}

这里使用了@objc dynamic关键字来获得与基于KVC的Objective-C的NSSortComparator的兼容性。

照常定义数组:

var objects : [MyObject] = [
    MyObject(dateYear: 2017, dateMonth: 12, dateDay: 7),
    MyObject(dateYear: 2017, dateMonth: 11, dateDay: 24),
    MyObject(dateYear: 2016, dateMonth: 5, dateDay: 9),
    MyObject(dateYear: 2016, dateMonth: 2, dateDay: 15),
    MyObject(dateYear: 2014, dateMonth: 7, dateDay: 13),
    MyObject(dateYear: 2016, dateMonth: 11, dateDay: 1)
]

2。制作排序描述符并排序

var descriptor1 = NSSortDescriptor(key: "dateMonth", ascending: true)
var descriptor2 = NSSortDescriptor(key: "dateYear", ascending: true)
var sorted = (objects as NSArray).sortedArray(using: [descriptor1, descriptor2]) as! [MyObject]

输出(月|年|日)

sorted.forEach {
    print($0.dateMonth, $0.dateYear, $0.dateDay)
}

_

2 2016 15
5 2016 9
7 2014 13
11 2016 1
11 2017 24
12 2017 7

指定多个排序描述符可让您确定排序标准的优先级。先考虑月份,按升序排列,有条件的话按年升序排列,日就这样。这是排序描述符有用的地方。

P.S 如果您不需要这些额外的标准并且不关心次要顺序,那么只需比较两个月的组件:

func month(of date: Date) -> Int {
    return Calendar.current.component(.month, from: date)
}

var sorted = objects.sorted(by: {month(of: $0.Edate) > month(of: $1.Edate) })

P.P.SNSSortDescriptors 相同的功能可以通过使用那些嵌套的 for 循环编写您自己的排序算法来很好地实现,但是 NSSortDescriptor 非常方便。

关于ios - 按月对数据进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47746957/

相关文章:

ios - 使用 Swift 2 的 NSCalendar 单元标志编译错误

ios - xcode 6.1 iphone/ipad Storyboard

ios - iOS的虚拟内存限制是多少?

ios - 没有二维数组的快速 UICollectionView 部分分离

ios - 如何在 Swift 中对 Eureka 库中的 MultipleSelectorRow 值进行排序?

ios - 从 TableView 执行 segue 时出现延迟或错误

swift - 为什么变量赋值之外的数字会编译?

c++ - 在不知道值类型的情况下从前向迭代器获取反向迭代器

python - 对现有项目列表进行排序以比较聚类解决方案

algorithm - 为每个元素找到最接近的更大元素