《Swift NSDictionary 的详细使用和部分方法介绍 和 哈希表(散列)的阐述和解释 》

来源:互联网 发布:minitool数据恢复软件 编辑:程序博客网 时间:2024/05/03 00:00

/*

    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, ” tom ” > <8, 

” Jane ” > <12, ” Bit ” > <17, ” Lily ” > <20, ” 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", "B": "2", "A": "1"]

                  ["C": "3", "B": "2", "A": "250"]

        */

        

        // 第二种

        dict5.updateValue("250", forKey:"B")

        //打印

        print(dict5)

        /*

        输出:       ["C": "3", "B": "2", "A": "250"]

                     ["C": "3", "B": "250", "A": "250"]

        */

        // 第三中 (测试也是增加)

        dict5.updateValue("250", forKey:"BJ")

        //打印

        print(dict5)

        /*

        输出:      ["C": "3", "B": "250", "A": "250"]

                   ["B": "250", "A": "250", "BJ": "250", "C": "3"]

        注意:这里可以看出字典是无序的,也可增加元素

        */

        

     /************************************************************/

        // 字典元素的删除

        // 第一种:有指定key 的删除

        dict5.removeValueForKey("BJ")

        // 打印

        print(dict5)

        /*

        输出:   ["B": "250", "A": "250", "BJ": "250", "C": "3"]

                ["B": "250", "A": "250", "C": "3"]

        */

        

        // 第二种 移除指定哈希位置的删除

        // 首先声明一个 DictionaryIndex 对象

        let  index : DictionaryIndex = dict5.indexForKey("B")!

        // 开始移除

        dict5.removeAtIndex(index)

        // 打印

        print(dict5)

        /*

        输出:    ["B": "250", "A": "250", "C": "3"]

                 ["A": "250", "C": "3"]

        */

        

        // 第三种  有两种方式,结果一样,但是意义不一样

        dict5.removeAll()

        

        dict5.removeAll(keepCapacity: true)

        dict5.removeAll(keepCapacity: false)

        // 打印

        print(dict5)

        // 输出: [:]

        

    /**********************************************************/

        //字典的便利

        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

        A

        SB

        */

       // 这也可以判断字典是否为空

       print( dict1.isEmpty )

        // 获取容器顶部数据

       print(dict1.popFirst())

        


    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }



}


1 0
原创粉丝点击