sorting - 如何按多个条件对 Swift 对象进行排序

标签 sorting swift

我有一个 Swift 对象列表,我想按多个条件对其进行排序。列表中的对象属于 DateRange 类型:

class DateRange {
    var from: NSDate?
    var to: NSDate?
}

该列表包含许多这样的对象,其中一些 fromto 字段为 nil。我希望此列表按以下方式排序:

  1. 首先是所有有日期的对象
  2. 然后对象至少有一个日期(fromto)
  3. 最后没有对象

日期本身并不重要,重要的是它们的存在。在 Ruby 中我可以这样做(如果日期是 nil 我将它设置为一个非常低的日期):

date_ranges.sort { |a, b|
  [fix_nil(a.from), fix_nil(a.to)] <=> [fix_nil(b.from), fix_nil(b.to)]
}.reverse

def fix_nil(val)
  val.nil? ? Date.new(0) : val
end

使用 Swift 执行此操作的最佳方法是什么?提前致谢。

最佳答案

似乎将 dateCount 计算属性添加到您的 DateRange 类型可能是个好主意。这将是模式匹配的好时机:

extension DateRange {
    // returns the number of non-nil NSDate members in 'from' and 'to'
    var dateCount: Int {
        switch (from, to) {
        case (nil, nil): return 0
        case (nil, _): return 1
        case (_, nil): return 1
        default: return 2
        }
    }
}

然后你可以用一个简单的闭包对你的列表进行排序:

var ranges = [DateRange(nil, nil), DateRange(NSDate(), nil), DateRange(nil, NSDate()), DateRange(nil, nil), DateRange(NSDate(), NSDate())]
ranges.sort { $0.dateCount > $1.dateCount }

如果你愿意,你甚至可以用更多的几行使其Comparable:

extension DateRange : Comparable { }
func ==(lhs: DateRange, rhs: DateRange) -> Bool {
    return lhs.dateCount == rhs.dateCount
}
func <(lhs: DateRange, rhs: DateRange) -> Bool {
    return lhs.dateCount > rhs.dateCount
}

这使您可以使用运算符参数正确地对列表进行排序:

ranges.sort(<)

关于sorting - 如何按多个条件对 Swift 对象进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26725224/

相关文章:

ios - UIProgressBar:如何根据背景颜色更改UILabel颜色

ios - 在 Swift 中从 Firebase 构建和检索数据的问题

ios - 使用带有 AutoLayout 的 UICollectionView 实现聊天布局

c++ - 在排序的 STL 容器中查找给定键的 "best matching key"

linux - 如何使用 GNU "sort"对一个键进行随机排序,而另一个键保持其原始排序顺序

sql - 如何在SQL Server中查找与给定字符串相似的字符串?

regex - 转换任何语言的数字字符串,同时保留前导零

sorting - 评估 Richfaces 排序中 Facelets 组件的表达

laravel - 如何在 Laravel 中对 Eloquent 对象的集合进行排序?

ios - DynamoDB 如何对 bool 值使用过滤器表达式