《Swift NSDictionary 的详细使用和部分方法介绍 和 哈希表(散
/* 《Swift NSDictionary 的详细使用和部分方法介绍 和 哈希表(散列)的阐述和解释 》 */ /* 第一步:我们首先,必须了解一个概念性的东西那就是:哈希 (也称散列) (1)哈希的主要解释是: 哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进 制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而 且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的 两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用 于快速查找和加密算法 (2)从解释中你能得到什么重要的信息,我得到的是 1》哈希值是可以将一个任意长的二进制转化为一个固定长度的二进制。 2》哈希列表是跟进式变化的。 3》使用途径:快速查找和加密 (3) 对于哈希快速查找,是面试的时候,也有问道的时候(只是,在面是的时候,不 是直接问的,本人在去(爱奇艺)面试的时候,领略过)。 针对快速查找进行根本的回答: 哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映射到一个有限的地 址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或 散列,所得存储位置称为哈希地址或散列地址。作为线性数据结构与表格和队列等相比,哈 希表无疑是查找速度比较快的一种。 注意: 这是将(key)作为一个哈希表或者散列(亲,你不要看错了)。 哈希方法在“键- 值对”的存储位置与它的键之间建立一个确定的对应函数关系 hash() , 使得每一个键与结构中的一个唯一的存储位置相对应:存储位置=hash( 键 )在搜索时,首 先对键进行hash 运算,把求得的值当做“键 - 值对”的存储位置,在结构中按照此位置 取“键 - 值对”进行比较,若键相等,则表示搜索成功。在存储“键 - 值对”的时候,依照 相同的 hash 函数计算存储位置,并按此位置存放,这种方法就叫做哈希方法,也叫做散 列方法。在哈希方法中使用的转换函数 hash 被称作哈希函数 ( 或者散列函数 ) 。按照 此中算法构造出来的表叫做哈希表 ( 或者散列表 ) 。 哈希函数建立了从“键- 值对”到哈希表地址集合的一个映射,有了哈希函数,我们就可 以根据键来确定“键 - 值对”在哈希表中的位置的地址。使用这种方法由于不必进行多次键 的比较,所以其搜索速度非常快,很多系统都使用这种方法进行数据的组织和检索。 举一个例子,有一组“键值对”:<5,” tom ” >、 <8,” Jane ” >、 <12,” Bit ” >、 <17,” Lily ” >、 <20,” sunny ” >,我们按照如下哈希函数对键进 行计算 :hash(x)=x%17+3 ,得出如下结果: hash(5)=8 、 hash(8)=11 、 hash(12)=15 、 hash(17)=3 、 hash(20)=6 。我们把 <5, ” Jane ” >、 <12,” Bit ” >、 <17,” sunny ” >分别 放到地址为 8 、 11 、 15 、 3 、 6 的位置上。当要检索 17 对应的值的时候,只 要首先计算 17 的哈希值为 3 ,然后到地址为 3 的地方去取数据就可以找到 17 对应的 数据是“ Lily ”了,可见检索速度是非常快的。 你们理解了吗????? 第二部:我们就要进行字典介绍,我们看代码。如下: // Created by 周双建 on 15/12/30. // Copyright ? 2015年 周双建. All rights reserved. // import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() /***********************************************************/ // 字典的介绍 /* 字典是用来保存同种类型的容器,容器中的数据是无序存在的(数组是有序的) */ // 字典的声明方式 // 第一种 var dict1 = ["A":"I","B":"Y","C":"A","D":"SB"] // 输出字典 print("(dict1["A"])(dict1["B"])(dict1["C"])(dict1["D"])") // 输出:Optional("I")Optional("Y")Optional("A")Optional("SB")
// 第二种 var dict2:Dictionary<String,String> = [:] // 进行赋值 dict2 = ["2": "sv"] print(dict2) // 输出: ["2": "sv"]
// 第三种 var dict3 = Dictionary <String,String> () // 赋值 dict3 = ["zsj":"hjk"] //输出 print(dict3) //输出: ["zsj": "hjk"]
// 第四种 var dict4 = [String:String]() // 赋值 dict4 = ["2":"df"] // 打印 print(dict4) // 输出 : ["2": "df"]
/************************************************************/ // 获取字典里数据的个数 let 个数:Int = dict1.count // 打印获取结果 print(个数) // 输出 : 4 /*************************************************************/ // 字典元素的访问 let Cell1 = dict1["A"] print(Cell1) // 输出: Optional("I") // 我们在访问一个不存在的元素 let Cell2 = dict1["GHJ"] print(Cell2) // 输出: nil // 注意: 如果查询的key 是不存在的。那么得到的对象是 nil (注意类型)
// 字典元素的增加 var dict5 = ["A":"1","B":"2"] // 增加另外的元素 (还有另一个方法:是在修改数据里往下看) dict5["C"] = "3" // 打印 print(dict5) // 输出: ["C": "3","B": "2","A": "1"] // 增加到第一个位置了
/**************************************************************/ // 字典元素的数据更改 // 第一种 dict5["A"] = "250" // 打印 print(dict5) /* 输出: 前 ["C": "3","A": "1"] 后 ["C": "3","A": "250"] */
// 第二种 dict5.updateValue("250",forKey: "B") // 输出: 前 ["C": "3",0)"> 后 ["C": "3","B": "250",0)"> // 第三中 (测试也是增加) dict5.updateValue("250",forKey: "BJ") // 后 ["B": "250","A": "250","BJ": "250","C": "3"] 注意:这里可以看出字典是无序的,也可增加元素 */
/************************************************************/ // 字典元素的删除 // 第一种:有指定key 的删除 dict5.removeValueForKey("BJ") // 输出: 前 ["B": "250","C": "3"] 后 ["B": "250",0)"> */
// 第二种 : 移除指定哈希位置的删除 // 首先声明一个 DictionaryIndex 对象 let index : DictionaryIndex = dict5.indexForKey("B")! // 开始移除 dict5.removeAtIndex(index) // 输出: 前 ["B": "250",0)"> 后 ["A": "250",0)"> // 第三种 : 有两种方式,结果一样,但是意义不一样 dict5.removeAll()
dict5.removeAll(keepCapacity: true) dict5.removeAll(keepCapacity: false) // // 输出: [:]
/**********************************************************/ //字典的便利 for (key,value) in dict1 { print("key:(key) and value:(value)") } /* 输出 : key:B and value:Y key:A and value:I key:C and value:A key:D and value:SB */
// 获取字典的所有 Key for str in dict1.keys { print(str) } /* B A C D // 获取字典的所有values for str in dict1.values { print(str) } /* Y I SB */ // 这也可以判断字典是否为空 print( dict1.isEmpty ) // 获取容器顶部数据 print(dict1.popFirst())
} override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |