Swift中数组、集合和字典的区别

6l7fqoea  于 2023-01-04  发布在  Swift
关注(0)|答案(4)|浏览(163)

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

5kgi1eie

5kgi1eie1#

以下是不同类型之间的实际差异:
数组是有效的有序列表,用于在顺序很重要的情况下存储信息列表。
例如,在tableView中显示的社交网络应用中的帖子可以存储在数组中。
集合的不同之处在于顺序不重要,它们将用于顺序不重要的情况。
当需要确保某个项目在集合中只出现*一次*时,集合特别有用。
字典用于存储
key,value
对,当您希望像在字典中一样使用键轻松查找值时,可以使用字典。
例如,可以在字典中存储项目列表和指向有关这些项目的详细信息的链接。
希望这有帮助:)
(For要了解更多信息并查找Apple自己的定义,请访问https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html查看Apple指南)

0vvn1miw

0vvn1miw2#

详细的文档可以在Apple's guide上找到。下面是从中提取的一些快速定义:
阵列
数组将相同类型的值存储在有序列表中。同一个值可以在数组中的不同位置多次出现。
设置
集合在集合中存储同一类型的不同值,但没有定义顺序。当项的顺序不重要,或者需要确保项只出现一次时,可以使用集合而不是数组。
字典
字典存储集合中相同类型的键和相同类型的值之间的关联,但没有定义顺序。每个值都与唯一键关联,该键充当字典中该值的标识符。与数组中的项不同,字典中的项没有指定顺序。当需要根据标识符查找值时,可以使用字典。这与使用真实世界的字典来查找特定单词的定义的方式非常相似。

8e2ybdfx

8e2ybdfx3#

老线程性能还值得一谈。
在数组或字典中给定N个元素的情况下,当您尝试访问元素或添加或删除对象时,值得考虑性能。

阵列

访问**一个随机元素的代价与访问第一个或最后一个元素的代价相同,因为元素是按顺序排列的,所以可以直接访问它们,它们将花费1个周期。

插入元素的成本很高。如果添加到开头,则将花费1个周期。插入到中间,余数需要被移位。2在最坏的情况下,它会花费你N个周期(平均N/2个周期)。如果您追加到末尾并且数组中有足够的空间,则将花费1个周期。否则将复制整个数组,这将花费N个周期。* 这就是为什么在操作开始时为数组分配足够的空间非常重要 *。
从开头或结尾删除将花费1。从中班工序开始需要。平均为N/2。
查找具有给定属性的元素将花费N/2个周期。

因此,使用大型数组时要非常谨慎。

字典

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

0g0grzrc

0g0grzrc4#

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

Dictionary- HashTable,HashMap -保存键/值对。它包含一个bucket/basket(数组结构,通过索引访问),其中每个bucket/basket包含另一个结构(数组列表,链表,树)。冲突通过Separate chaining解决。主要思想是:

1.计算key的散列码About(https://stackoverflow.com/a/64920421/4770877)(Hashable),并基于该散列码计算桶的索引(例如通过使用模(mod))。
1.因为哈希函数返回Int,所以它不能保证两个不同的对象会有不同的哈希码。更详细地说,basket的计数不是等于Int. max。当我们有两个不同的对象有相同的哈希码时,或者当具有不同散列码的两个对象位于同一个筐中时的情况-这是冲突。这就是为什么当我们知道篮子的索引时,我们应该检查是否有人和我们的key相同,Equatable是救援。如果两个对象相等,则key/value对象将被替换,否则-新的key/value对象将被添加到里面

find element - O(1) to O(n) 
insert/delete - O(1) to O(n)

O(n)-如果每个对象的哈希代码都相同,这就是为什么我们只有一个桶,所以哈希函数应该均匀地分配元素
如您所见,HashMap不支持按索引访问,但在其他情况下,它具有更好的性能

-散列集。基于没有值的哈希表

  • 您还可以实现一种Java TreeMap/TreeSet,它是sorted结构,但访问元素的复杂度为O(log(n))

Java Thread safe Collections(https://stackoverflow.com/a/65410514/4770877)

相关问题