/*
《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.
}
}