/*

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.

}



}

《Swift NSDictionary 的详细使用和部分方法介绍 和 哈希表散列)的阐述和解释 》的更多相关文章

  1. ios – 声明NSDictionary并在Swift中添加键值对?

    我一直在尝试使用类类型键和值来声明一个NSDictionary,如下所示:这里,“Category”和“SubCategory”是全局类.我知道我不能将类类型用于关键字段.但是,无论如何,我应该做到这一点.有没有办法做到这一点?如何声明专门的NSDictionary或类似的东西来做到这一点?

  2. ios – Swift相当于`[NSDictionary initWithObjects:forKeys:]`

    Swift的原生字典是否与[NSDictionaryinitWithObjects:forKeys:]相当?假设我有两个带键和值的数组,并希望将它们放在字典中.在Objective-C中,我这样做:当然我可以通过两个数组迭代一个计数器,使用vardict:[String:Int]并逐步添加东西.但这似乎不是一个好的解决方案.使用zip和enumerate可能是同时迭代两者的更好方法.然而,这种方法

  3. ios – NSJSONSerialization崩溃的应用程序

    我有一本字典,当我记录它时显示…我正试图将它变成NSData,用于像这样的JSONWeb服务……但每次我运行它时,应用程序都会崩溃.字典正确形成,应用程序只是崩溃在这一行.在AppCode中,我收到崩溃报告……在Xcode中,应用程序停止,如果我尝试继续,它会因错误而停止…

  4. xcode – 错误“线程1:断点2.1”

    我正在研究RESTAPI管理器.这是一个错误,我无法解决它.我得到的错误在下面突出显示.当我打电话给这个班级获取资源时:我评论的线打印:Thread1:breakpoint2.1我需要修复错误的建议.任何建议都非常感谢解决方法您可能在不注意的情况下意外设置了断点.单击并拖动代表断路器外部断点的蓝色刻度线以将其擦除.

  5. ios – Apple Watch,WatchKit Extension和主要应用程序

    有逻辑的主要应用程序,我们将应用程序扩展到AppleWatch.添加目标xCode后,再创建2个应用程序:扩展代码和监视工具包应用程序.问题:扩展程序中的代码如何重用已准备好的主要iOS应用程序的逻辑?

  6. ios – 在Swift中获取Cocoa Touch Framework项目版本字符串

    有谁知道这是否是我的项目设置中的缺陷,Xcode中的一个错误,或者是否有一种方法可以将Swift中的框架版本作为String或数组获取,这样我可以提供比major.minor更精细的版本控制?

  7. ios – 搜索数组swift中的对象

    我正在尝试使用UISearchController创建搜索功能.但是,我似乎无法使其与我的团队对象一起工作.我首先创建了一个包含id,name和shortname的TeamObject.然后我从一个url中检索teamData,并将TeamObjects添加到一个填充到tableView中的数组中.这个tableView包含一个searchController,它假设过滤数据,但没有任何反应.阵列

  8. ios – 如果Element符合给定的协议,则扩展阵列以符合协议

    如果是这样,语法是什么?解决方法Swift4.2在Swift4.2中,我能够使用符合这样的协议的元素扩展数组:

  9. ios – Swift可选项:语言问题,还是做错了什么?

    应该有可选的类型;type是但是,如果我这样做,它的工作原理:它似乎是基本的替代,但我可能会遗漏一些语言的细微差别.谁能对此有所了解?之后就像暧昧一样,更多,这是我的解决方案:这适用于所有非对象Swift对象,包括Swift字符串,数字等.感谢Viktor提醒我String不是Swift中的对象.如果您知道值的类型,您可以替换任何?使用适当的可选类型,如String?

  10. 通过AFNetworking 2.0上传iOS图像

    我一直在寻找新的AFNetworking2.0上传图像的例子.但是我正在撞墙,无法弄清楚代码有什么问题.所以这是我使用的代码TIA解决方法我最终使用了多部分请求

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部