【问题标题】:Sort Dictionary by Key Value按键值排序字典
【发布时间】:2015-10-10 05:45:53
【问题描述】:
let dict: [String:Int] = ["apple":5, "pear":9, "grape":1]

如何根据Int 值对字典进行排序,以便输出为:

sortedDict = ["pear":9, "apple":5, "grape":1]

当前尝试(未正确排序):

let sortedDict = sorted(dict) { $0.1 > $1.1 } 

【问题讨论】:

  • 字典没有按设计排序。它们是键值容器。
  • 所以我需要转换为数组,排序,然后重新创建字典?
  • 我想不出需要对字典进行排序的用例。您通常想要做的是将键作为列表获取,对列表进行排序,然后遍历该排序列表以访问值。
  • @Emma,重新创建的字典怎么会有排序顺序?

标签: swift sorting


【解决方案1】:

您需要对字典值进行排序,而不是对键进行排序。您可以从字典中创建一个元组数组,按其值对其进行排序,如下所示:

Xcode 9 • Swift 4Xcode 8 • Swift 3

let fruitsDict = ["apple": 5, "pear": 9, "grape": 1]
let fruitsTupleArray = fruitsDict.sorted{ $0.value > $1.value }

fruitsTupleArray // [(.0 "pear", .1 9), (.0 "apple", .1 5), (.0 "grape", .1 1)]

for (fruit,votes) in fruitsTupleArray {
    print(fruit,votes)
}

fruitsTupleArray.first?.key   // "pear"
fruitsTupleArray.first?.value   // 9

使用您的键对字典进行排序

let fruitsTupleArray = fruitsDict.sorted{ $0.key > $1.key }
fruitsTupleArray  // [(key "pear", value 9), (key "grape", value 1), (key "apple", value 5)]

使用字典的键和本地化比较对字典进行排序:

let fruitsTupleArray = fruitsDict.sorted { $0.key.localizedCompare($1.key) == .orderedAscending  }

编辑/更新

我们还可以扩展Sequence 协议并实现一个自定义排序,只要它符合Comparable,它就接受一个谓词并使用keypath 属性进行排序:

extension Sequence {
    func sorted<T: Comparable>(_ predicate: (Element) -> T, by areInIncreasingOrder: ((T,T)-> Bool) = (<)) -> [Element] {
        sorted(by: { areInIncreasingOrder(predicate($0), predicate($1)) })
    }
}

用法:

let sortedFruitsAscending = fruitsDict.sorted(\.value)
print(sortedFruitsAscending)

let sortedFruitsDescending = fruitsDict.sorted(\.value, by: >)
print(sortedFruitsDescending)

这将打印出来

[(键:“葡萄”,值:1),(键:“苹果”,值:5),(键:“梨”,值:9)]

[(键:“梨”,值:9),(键:“苹果”,值:5),(键:“葡萄”,值:1)]

【讨论】:

  • 这是我一直在寻找的答案。极其简单、易读和独立。适用于 Swift 4.2 和 Xcode 10.1。非常感谢!
【解决方案2】:

字典无法排序。一般来说,当我需要从字典中排序的东西时,我会为我的字典键创建一个单独的数组。

在您的情况下,创建一个键数组,通过比较它们在字典中的值对它们进行排序。

【讨论】:

    【解决方案3】:

    可以通过下面的实现来实现

    let sortedDictionary = unsortedDictionary.sorted{$0.key &gt; $1.key}

    【讨论】:

      【解决方案4】:

      使用 KeyValuePairs 而不是 Dictionary

      “字典中键值对的顺序在突变之间是稳定的,但在其他方面是不可预测的。如果您需要键值对的有序集合并且不需要字典提供的快速键查找,请参阅 KeyValuePairs输入替代方案。” - Swift Dictionary

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-30
        • 1970-01-01
        • 2014-01-18
        • 2021-11-27
        • 2011-06-17
        • 2015-01-04
        相关资源
        最近更新 更多