【问题标题】:Swift dictionary sorting快速字典排序
【发布时间】:2016-12-28 16:46:17
【问题描述】:

只是想知道字典在 Swift 中是如何排序的。例如以下代码。

var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic"]

occupations["Jayne"] = "Pirate"

for (name, occupation) in occupations{
print("\(name) is a \(occupation)")
}

结果是这样的

Kaylee is a Mechanic 
Malcolm is a Captain
Jayne is a Pirate

我的问题是成立的。循环如何决定哪个名称(或键)将首先通过上述循环?

【问题讨论】:

  • developer.apple.com/library/content/documentation/Swift/…: “字典存储了没有定义顺序的集合中相同类型的键和相同类型的值之间的关联。”我>
  • 阅读哈希表,这是 Swift 的 Dictionary 用来存储元素的。一个元素在表中的位置主要取决于它的哈希和表中的桶数,其次取决于哈希表如何处理冲突。
  • 如果你只是好奇也没关系,但请记住,你永远不应该编写依赖于字典顺序的代码。由于没有定义顺序,他们完全有权更改操作系统/语言版本之间的顺序。

标签: swift sorting dictionary


【解决方案1】:

来自苹果Collection Types Documentation

字典存储相同类型的键和 没有定义排序的集合中相同类型的值。每个 value 与唯一键相关联,该键充当标识符 字典中的那个值。 与数组中的项目不同,a 中的项目 字典没有有指定的顺序

默认情况下,字典数据结构具有未指定的排序,这意味着每次您将遍历它时,您可能会有不同的排序。但是您可以根据它的 keysvalues 进行排序,它们都表示为数组。

所以,假设您要根据键进行排序:

    var occupations = [
    "Malcolm": "Captain",
    "Kaylee": "Mechanic"]

occupations["Jayne"] = "Pirate"

for key in occupations.keys.sort() {
    print("KEY: \(key) VALUE: \(occupations[key])")
}

控制台应该显示 -sorted based on key-:

KEY:Jayne VALUE:可选(“海盗”)

KEY:Kaylee VALUE:可选(“Mechanic”)

KEY:马尔科姆 VALUE:可选(“Captain”)

请注意,这些值是可选的,您可能需要“可选绑定”它们...

希望这会有所帮助。

【讨论】:

  • 有一个未指定的顺序与无序不同——字典有一个顺序(它只是未指定),因此重复迭代给定的字典不会产生不同的元素顺序——你会得到相同的元素以相同的顺序。但是,添加或删除元素可以更改此顺序(同样,未指定更改顺序的方式)。
  • @Hamish 感谢您的注意,答案已被编辑。
【解决方案2】:

我认为您正在寻找这样的东西:

    var occupations = [
        "Malcolm": "Captain",
        "Kaylee": "Mechanic"]

    occupations["Jayne"] = "Pirate"

    let unsortedKeys = occupations.keys //get dictionary keys
    let sortedKeys = unsortedKeys.sorted(by: <) //sort dictionary keys
    for key in sortedKeys {
        print("\(key) is a \(occupations[key])")
    }

希望有帮助

【讨论】:

    猜你喜欢
    • 2020-11-12
    • 2018-09-19
    • 1970-01-01
    • 2018-09-22
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2020-08-14
    相关资源
    最近更新 更多