【问题标题】:Difference between Array, Set and Dictionary in SwiftSwift 中数组、集合和字典的区别
【发布时间】:2017-04-03 04:33:21
【问题描述】:

我是 Swift Lang 的新手,看过很多教程,但不清楚 - 我的问题是 ArraySetDictionary 集合类型之间的主要区别是什么?

【问题讨论】:

  • Swift Language Guide - Collection Types 很好地涵盖了这个主题。例如。一些亮点[强调我的]:“一个数组相同类型的值存储在一个有序列表" // "一个set相同类型的不同值存储在一个没有定义排序的集合中。 " // "字典存储同类型的键同类型的值之间的关联 没有定义排序的集合。".

标签: arrays swift dictionary collections set


【解决方案1】:

以下是不同类型之间的实际区别:

数组是有效的有序列表,用于在顺序很重要的情况下存储信息列表。

例如,社交网络应用程序中显示在 tableView 中的帖子可能存储在数组中。

集合在顺序无关紧要这一意义上是不同的,这些将用于顺序无关紧要的情况。

当您需要确保项目在集合中仅出现一次时,集合特别有用。

字典用于存储键、值对,当您想使用键轻松查找值时使用,就像在字典中一样。

例如,您可以将项目列表和指向有关这些项目的更多信息的链接存储在字典中。

希望这会有所帮助:)

(如需更多信息和查找 Apple 自己的定义,请查看 Apple 指南https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html

【讨论】:

    【解决方案2】:

    详细文档可以在Apple's guide 上找到。以下是从那里提取的一些快速定义:

    数组

    数组将相同类型的值存储在有序列表中。同一个值可以多次出现在数组的不同位置。

    设置

    集合将相同类型的不同值存储在没有定义顺序的集合中。当项目的顺序不重要时,或者当您需要确保项目只出现一次时,您可以使用集合而不是数组。

    字典

    字典将相同类型的键和相同类型的值之间的关联存储在没有定义排序的集合中。每个值都与一个唯一键相关联,该键充当字典中该值的标识符。与数组中的项目不同,字典中的项目没有指定的顺序。当您需要根据标识符查找值时,您可以使用字典,这与使用现实世界的字典查找特定单词的定义的方式非常相似。

    【讨论】:

      【解决方案3】:

      旧线程但值得谈论性能。

      在数组或字典中给定 N 个元素,当您尝试访问元素或添加或删除对象时,值得考虑性能。

      数组

      访问随机元素的成本与访问第一个或最后一个元素的成本相同,因为元素彼此顺序跟随,因此可以直接访问。它们将花费您 1 个周期。

      插入元素的成本很高。如果您添加到开头,它将花费您 1 个周期。插入到中间,剩余部分需要移位。在最坏的情况下(平均 N/2 个周期),它可能会花费您多达 N 个周期。如果您追加到末尾并且阵列中有足够的空间,它将花费您 1 个周期。否则将复制整个数组,这将花费您 N 个周期。 这就是为什么在操作开始时为数组分配足够的空间很重要的原因

      从头或尾删除会花费你 1. 从中间移位操作是必需的。平均为 N/2。

      查找具有给定属性的元素将花费您 N/2 个周期。

      所以对大数组要非常小心。

      字典

      虽然字典杂乱无章,但它们可以在这里为您带来一些好处。由于键被散列并存储在散列表中,因此任何给定的操作都将花费您 1 个周期。唯一的例外是找到具有给定属性的元素。在最坏的情况下,它可能会花费您 N/2 个周期。但是,通过巧妙的设计,您可以将属性值分配为字典键,因此无论里面有多少元素,查找只会花费您 1 个周期。

      【讨论】:

      • 谢谢@Teddy,我对性能方面很感兴趣,这个答案结束了我的搜索。您能否在比较中也包括集合?
      【解决方案4】:

      Swift 集合 - 数组、字典、集合

      每个集合都是动态的,这就是为什么它有一些额外的步骤来展开和折叠。数组应该分配更多内存并将旧日期复制到新日期中,字典还应该为里面的每个对象重新计算篮子索引

      Big O (O) 表示法描述了某些功能的性能

      Array - ArrayList - 对象的动态数组。它基于通常的数组。它用于您经常应该通过索引访问的任务

      get by index - O(1)
      find element - O(n) - you try to find the latest element
      insert/delete - O(n) - every time a tail of array is copied/pasted
      

      字典 - HashTable、HashMap - 保存键/值对。它包含一个桶/篮子(数组结构,按索引访问),其中每个都包含另一个结构(数组列表,链表,树)。碰撞由Separate chaining 解决。主要思想是:

      1. 计算键的哈希码[About] (Hashable) 并根据该哈希码计算存储桶的索引(例如使用模(mod))。
      2. 由于 Hashable 函数返回Int,它不能保证两个不同的对象会有不同的哈希码。更多的篮子计数 等于 Int.max。当我们有两个具有相同哈希码的不同对象时,或者当两个具有不同哈希码的对象位于同一个篮子中时 - 这就是碰撞。这就是为什么当我们知道篮子的索引时,我们应该检查是否有人与我们的 key 相同,而Equatable 是救命稻草。如果两个对象相等,键/值对象将被替换,否则 - 新的键/值对象将被添加到里面
      find element - O(1) to O(n) 
      insert/delete - O(1) to O(n) 
      

      O(n) - 如果每个对象的哈希码相同,这就是我们只有一个桶的原因。所以哈希函数应该均匀分布元素

      如您所见,HashMap 不支持按索引访问,但在其他情况下它具有更好的性能

      Set - 哈希集。基于不使用 value

      的 HashTable

      [Java Thread safe Collections]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-03
        • 1970-01-01
        • 2017-05-28
        • 1970-01-01
        • 1970-01-01
        • 2012-03-14
        相关资源
        最近更新 更多