Tag: 字典

哈希表寓言

在Swift中从头开始创建哈希表 理论 哈希表是一个强大的数据结构,大多数开发人员每天都在有意或无意地使用它们。 在Swift字典中是哈希表。 我们应该了解它们是如何工作的,以便我们可以最好地使用它们。 在本文中,我将介绍如何在Swift中制作哈希表的简化版本。 我建议,如果您想了解哈希表的内部工作原理,请遵循并与我一起做一个! 什么是哈希表,我为什么要关心? 哈希表是一种使用键存储和检索值的数据结构。 例如,我可以有一个名称和年龄的哈希表: myHashTable.set(值:30,forKey:“ Manny”) myHashTable.getValue(forKey:“ Manny”)//应该返回30 哈希表的特别之处在于,在正常情况下,我们可以使用键来获取值,而无需遍历数组。 如果我们有一个键值对数组,则必须在整个数组中搜索以找到特定的键值。 这通常称为O(n)访问时间,这意味着获取值的时间基于元素的数量(n)是线性的。 由于哈希表的强大功能,我们可以近似地将值取回O(1)(恒定时间),这使得哈希表非常适合存储我们要基于唯一键快速检索的数据。 重要的是要注意,哈希表不能保持顺序,并且不如用于遍历元素的数组好。 那么,这是什么O(1)法术? 假设您将衣服堆成一堆。 每天早晨,您将不得不在堆里过筛以寻找当天的服装。 现在想象一下,您拥有的所有衣物都有一个抽屉,而这些物品总是放在同一抽屉中。 您将能够非常快速地检索每件衣服! 过于简单的解释是,使用魔术哈希函数,我们的密钥被映射为整数。 该整数将对应于数组中的索引。 这个概念可能看起来像这样: 那么魔术散列函数会是什么样子? 也许为了生成字符串“ Manny”的哈希值,我们可以获得每个字符的整数表示并将它们加在一起。 因此,“ Manny”的哈希值可能等于515。您可能会意识到,由于交换属性“ Manny”将具有与“ Mynan”相同的哈希值。 进行字符串哈希处理有很多更好的方法,但最终它们都只是将字符串转换为整数。 请注意,键不必是字符串,它们可以是任何具有哈希函数的对象。 在理想情况下,每个键都将具有唯一的哈希值,但实际上这是不可行的。 仅根据字符串大小,可能会有数十亿个排列。 如果我们的字母表中只有小写字母,则五个字符的字符串的排列将为26⁵! 想一想,如果您的每件衣服都在自己的独特抽屉中,那么您将需要多少个抽屉。 那么,如何将所有可能的键唯一地映射到数组索引? 我们不! 碰撞和单独链接 哈希函数的目标是将所有可能的键均匀分布到整数范围内。 通过一点数学,我们可以减少这些整数,以便将它们包含在数组大小内。 这将不可避免地导致我们的某些键解析为相同的索引,但不要担心,有几种方法可以处理冲突。 什么是最好的解决方案,让您只用几个抽屉就能穿衣服? 如果您回答将成组的衣服放到抽屉里,那么您是正确的。 如果您只是大堆衣服,那么您的早晨一定很O(n)。 在这篇文章中,我选择使用称为“单独链接”的碰撞解决方案。 通过单独的链接,我们仍将使用键的哈希值来获取数组中的索引。 但是,这次我们将在该索引处有一系列键值对。 这使我们可以将可解析为相同索引的键值对放在可搜索链中。 为了简单起见,我们将使用数组来实现这些链(通常使用链表)。 这是“单独链接”的样子: […]

値が自选な字典のnil値の取り扱い

今朝呟いた本件ですが,色々补足しつつ记事としてまとめました。 値が自选な字典とは? 値がOptionalなDictionaryとは例えば次のようなものを指しています(値がOptionalなことが大事なのでString型以外でも何でも良いです)。 var d = [String:String?]() 以下の糖衣构文ですが,上の简単な记述とするのが一般的なはずです。 var d = Dictionary <String,可选>() 倾向于として値が可选な词典を扱うのはなるべくやめた方が良いと思っている ,例えば以下のように非Optionalでも下标して取った结果はString?となります。 var d = [String:String]() 让x:字符串? = d [“ key”] もし値がOptionalだと,次のように取得结果がString?? ( Optional<Optional> )とOptionalのネストになってしまいます。 var d = [String:String?]() 让x:字符串? = d [“ key”] 词典の各种处理の戻り値自体がこのように任选ように返すものが多いため,値の型自体が任选だとややこしくなります。大抵抗は値の型自体を任选にすることなく词典が包含する任选だけますハンドリングできると思っています。 とはいえどうしても値を可选としたいこともありえるかもしれませんし,色々いじってたら面白かった,という次第です(・‿・`) ちょっと相对きが长くなりましたが,以下本题です。

SmallSwiftTips#01:使用分组对元素进行分组:

对于第一个SmallSwiftTips,我将从一个非常方便的新Dictionary init开始,它是init(grouping:by:) 这个新的init是在Swift 4上引入的,它有助于创建一个新的分组Dictionary 。 它需要一个Sequence和一个闭包作为输入。 请注意,此新Dictionary的关键字将是闭包的结果。 在第一个示例中,闭包的结果为Character ,因此我们将有一个新的[Character: [String]]字典。 在第二个示例中,闭包的结果中有一个Bool值,为我们提供了一个新的[Bool: [String]] 。 您也可以使用一系列自定义对象。 此代码将返回一个非常方便的新[AssetType: [Asset]] 。 这可能会很有帮助,希望您喜欢并使用它。 😁🚀

字典和元组之间的区别

词典用于存储相同类型的无序值列表。 每个值都与唯一键相关联,该键充当字典中该值的标识符。 让我们创建示例字典 var studentDetails = [String:String]() 它也是一种可变类型,意味着您可以通过添加,删除或更改其项目来进行更改。 studentDetails [“ firstname”] = [“ Roy”] 元组表示单个组件中的值的集合。 在可以返回多种类型的函数时使用。 我们可以使用dot( . )表示法后跟值的索引来访问内部值: var name = [“ Joy”,“ Martin”] var firstname = name.0 var lastname = name.1 它可以是零个或多个类型的组合。 var value = [“ joy”,1,true] 元组上方是(String,Int,Bool)类型。 元组和字典之间的主要区别 元组是逗号分隔的多种类型的列表,字典是键值类型。 元组只能包含预定义数量的值,在字典中没有这种限制。 元组可以包含具有不同数据类型的不同值,而字典一次只能包含单个数据类型的值。 谢谢阅读。 如果您喜欢本文,请确保鼓掌以表示支持。

Swift 4集合类型

这个故事从根本上讲述了集合类型的声明和使用方法。 农历新年快乐2018 !!! 喔喔喔喔喔喔喔喔喔 有四种类型,包括: 数组 字典 组 元组 NSArray,NSDictionary,NSSet的Objective-C中的几乎所有方法都已迁移到Swift 4版本。 当然,由于SAFETY的Swift 4语言特性,对于那些刚从Objective-C那里碰到的人,会因快速声明的方式而有些恼火。 但是,它也可以让您实现更好的编码方式。 数组 var array1 = [1, 2, 3] var array2: [Int] = [1, 2, 3] var array3: Array = [1, 2, 3] 它们都是合法的书写方式,但是我将第二种格式清晰明了地指定。 字典 var dict1 = [“Dog”: 3, “Cat”: 5, “Rabbit”: 2] var dict2: [String:Int] = [“Dog”: 3, “Cat”: 5, “Rabbit”: […]