【问题标题】:Swift Sort an array with multiple sort criteria [duplicate]Swift 使用多个排序条件对数组进行排序[重复]
【发布时间】:2014-12-22 03:38:08
【问题描述】:

如何在 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. 状态DESC

我已经成功地根据条件 1 或 2 对这个数组进行了排序,但不能同时使用这两个条件。下面是代码:

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

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

【问题讨论】:

  • 我不同意这是完全重复的,因为这是关于字典输入而不是结构(尽管它非常相似)

标签: arrays sorting swift closures


【解决方案1】:

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

字典有点复杂,因为您不想两次提取数据并且可能会丢失键,但这实际上很好,因为 ==&lt; 可以处理可选的比较。

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) 可选,虽然它们可以与&lt; 比较,但不符合Comparable 所以你必须手动检查 nils,并且 b) 你想按降序对第二个条目进行排序。

【讨论】:

  • .Some(lhs) 和 .Some(RHS) 在哪里生成/它们代表什么?我想更好地理解这一点,因此我可以在示例中的两个之外添加其他排序顺序标准。
  • 他们要检查键是否丢失 - 但后来我意识到这是不必要的,因为 == 可以处理可比较的选项。我已经对其进行了编辑以删除它们。
猜你喜欢
  • 2016-10-02
  • 2012-11-02
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多