Swift对具有多个排序条件的数组进行排序

时间:2014-12-22 03:38:09

标签: arrays sorting swift closures

如何在Swift中按多个条件对数组进行排序?例如,如下所示的字典数组:

items = [
    [
        "item":"itemA"
        "status":"0"
        "category":"B"
    ],[
        "item":"itemB"
        "status":"1"
        "category":"C"
    ],[
        "item":"itemC"
        "status":"0"
        "category":"A"
    ],[
        "item":"itemD"
        "status":"2"
        "category":"A"
    ]
]

这需要按如下方式排序:

  1. 类别ASC
  2. status DESC
  3. 我已根据 条件1或2成功对此数组进行了排序,但两者都没有。以下是代码:

    itemArray.sort({
            $0["category"] < $1["category"])
        })
    

    如何将其扩展为包含给定订单中的多个排序标准?

1 个答案:

答案 0 :(得分:11)

您需要进行字典比较,即如果第一个字段相等,则比较第二个字段,否则比较第一个字段。

字典使它复杂化了一点,因为你不想两次获取数据并且键可能丢失,但实际上这很好,因为==<可以处理可选的比较。

let result = items.sorted {
    switch ($0["category"],$1["category"]) {
    // if neither “category" is nil and contents are equal,
    case let (lhs,rhs) where lhs == rhs:
        // compare “status” (> because DESC order)
        return $0["status"] > $1["status"]
    // else just compare “category” using <
    case let (lhs, rhs):
        return lhs < rhs
    }
}

实际上你可以在某些情况下使用lexicographicCompare进行比较 - 但在这种情况下它不会起作用,因为a)可选项,而它们可以与<进行比较,不要不符合Comparable所以你必须手动检查nils,b)你想按降序对第二个条目进行排序。