swift - 按键值对字典排序

标签 swift sorting

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 } 

最佳答案

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

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 协议(protocol)并实现自定义排序,该排序采用谓词并使用 keypath 属性进行排序,只要它符合 Comparable 即可:

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)

这将打印

[(key: "grape", value: 1), (key: "apple", value: 5), (key: "pear", value: 9)]

[(key: "pear", value: 9), (key: "apple", value: 5), (key: "grape", value: 1)]


编辑/更新:

对于 Xcode 13 或更高版本,您可以使用一个名为 KeyPathComparator 的新通用结构:

let fruitsTupleArray = fruitsDict.sorted(using: KeyPathComparator(\.value, order: .reverse))

关于swift - 按键值对字典排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31527754/

相关文章:

python - Sikuli:多个图标排序

swift - 使用 CoreData 在 SwiftUI 中填充列表

swift - watchOS 退出代码

swift - 在 Swift 中改变数据的静态结构

ios - Swift:如何在文本字段的左侧创建图像?

c++ - 排序 QtTableModel - QTableView 没有得到更新

java - 将数组列表格式化为特定格式

javascript - 使用 JavaScript 拆分逗号分隔的字符串但忽略分号之间的逗号

java:while循环-在进入花括号之间的语句之前使用分号的语句?

ios - 使用自动布局删除 UILabel 的空白区域