【问题标题】:Are Swift dictionaries automatically sorted?Swift 字典会自动排序吗?
【发布时间】:2016-09-14 16:24:14
【问题描述】:

我有这两个字典:

let test = ["Tomorrow": "Bla", "Month": "Bla"]
print(test) // ["Tuesday": "Bla", "Month": "Bla"]

let test1 = ["Tomorrow": "Bla", "One Month": "Bla"]
print(test2) // ["One Month": "Bla", "Tuesday": "Bla"]

似乎如果我使用关键字“One”,则元素会放在前面。为什么?

【问题讨论】:

  • 字典没有顺序,你看到的顺序绝对没有意义..
  • 已经被问了一千遍了,请先研究再问。字典没有排序。
  • @luk2302 和@EricD - 你们都应该更具体。实际上,有有序关联容器和无序关联容器。只是内部实现(通过哈希表)使 Swift 的 Dictionary 和 Objective-C 的 NSDictionary 成为无序容器。
  • @CouchDeveloper 不,我们不必更具体 - 我们在这里谈论的是 swift 字典,而不是一般的字典。而且这个问题之前已经被问过数千次这一事实并没有真正增加更具体的意愿。
  • @CouchDeveloper 谢谢 :)

标签: ios swift dictionary


【解决方案1】:

Swift 的Dictionary 是一种基于散列的数据结构。除非有特定的排序机制,否则基于哈希的结构中项目的顺序取决于几个因素:

  • 用作键的对象的哈希值 - hashValue 方法用于确定项目的桶号
  • 结构的大小 - 由于hashValue 可能远大于可用的桶数,因此使用限制机制(例如模桶数)来确定实际的桶数
  • 修改顺序 - 当键发生冲突时,这变得相关。稍后放置的具有重复哈希值的元素要么进入不同的存储桶,要么被放置在与实际存储桶关联的列表中。

例如,如果您在第二个示例中更改字典的大小,则项目的顺序会颠倒:

var test1 = [String:String]() // Use default initial capacity
test1["Tomorrow"] = "Bla"
test1["One Month"] = "Bla"
print(test1) // ["One Month": "Bla", "Tomorrow": "Bla"]

var test2 = [String:String](minimumCapacity: 11) // Use specific capacity
test2["Tomorrow"] = "Bla"
test2["One Month"] = "Bla"
print(test2) // ["Tomorrow": "Bla", "One Month": "Bla"]

由于其中一些参数超出了您的控制范围,因此出于所有实际目的,Dictionary 中的项目顺序可以被认为是任意的。

【讨论】:

  • 感谢您的解释!
猜你喜欢
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 2011-11-01
  • 2016-11-22
  • 2018-06-17
  • 2016-11-19
相关资源
最近更新 更多