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

4

如何在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. 按类别升序
  2. 按状态降序

我已经成功地根据条件1或2之一对这个数组进行了排序,但无法同时满足两个条件。以下是该代码:

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

如何扩展以包含按给定顺序的多个排序条件?


2
我不同意这是一个完全重复的问题,因为它涉及字典输入而不是结构体(尽管非常相似)。 - Airspeed Velocity
1个回答

12
您希望进行词典序比较,即如果第一个字段相等,则比较第二个字段,否则比较第一个字段。
由于字典会使情况稍微复杂一些,因为您不想两次提取数据并且键可能丢失,但这实际上是可以的,因为 == 和<可以处理可选比较。
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,所以您必须手动检查nil,b)您希望按降序对第二个条目进行排序。

“Some(lhs)”和“Some(RHS)”是在哪里生成的/它们代表什么?我想更好地理解这个问题,以便我可以添加除示例中的两个排序条件之外的其他排序条件。 - Michael Voccola
他们原本要检查是否缺少键,但后来我意识到这是不必要的,因为==可以处理可比较类型的可选项。我已经编辑过了,将它们删除了。 - Airspeed Velocity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接