数据结构和算法(七)之字典结构
一. 认识字典
- 生活中的字典
- 中文字典我们可以根据拼音去查找汉字,并且找到汉字对应的词以及解释。
- 英文字典也是类似,根据英文字母找到对应的单词,在查看其翻译和应用场景。
- 很多编程语言中都有字典的概念。
- 字典有什么特点呢?
- 字典的主要特点是一一对应的关系。
- 比如保存一个人的信息,在合适的情况下取出这些信息。
- 使用数组的方式:
[18,”Code”,1.88]
,可以通过下标值取出信息。 - 使用字典的方式:
{“age”:18,”name”:”code”,”heigth”:1.88}
.可以通过key
取出value
- 字典的映射关系:
- 有些编程语言中称这种映射关系为字典,因为他确实和生活中的字典比较相似。(比如
Swift
中Dictionary
,Python
中的dict
) - 有些编程语言中称这种映射关系为
Map
,注意Map
在这里不要翻译成地图,而是翻译成映射。(比如Java
中就有HashMap&TreeMap
等)
- 有些编程语言中称这种映射关系为字典,因为他确实和生活中的字典比较相似。(比如
- 字典和数组:
- 字典和数组对比的话,字典可以非常方便的通过
key
来搜索对应的value
,key
可以包含特殊含义,也更容易被人记住。
- 字典和数组对比的话,字典可以非常方便的通过
- 字典和对象:
- 很多编程语言(比如
Java
)中对字典和对象区分比较明显,对象通常是一种在编译期就确定下来的结构,不可以动态的添加或者删除属性。而字典通过会使用类似于哈希表的数据结构去实现一种可以动态的添加数据的结构。 - 但是在
JavaScript
中,似乎对象本身就是一种字典。所以在早期的JavaScript
中,没有字典这种数据类型,因为你完全可以使用对象去代替。 - 但是这里我们还是按照其他语言经常使用字典方式去封装一个字典类型,方便我们按照其他语言的方式去使用字典。(虽然本质上它内部还是用了一个对象,后面学习完哈希表我会简单谈一下对象和哈希表的关系)
- 很多编程语言(比如
创建字典类
-
我们向之前封装集合一样,封装一个字典的构造函数
// 创建字典的构造函数 function Dictionay(){ // 字典属性 this.item = {} }
-
代码解析:
- 非常简单,创建一个
Dictionary
的构造函数,用于我们字典的封装。 - 在字典中,我们使用了一个
items
属性,该属性是一个Object
对象。 - 也就是我们的字典是基于
Object
封装的,这个不难理解:就像我们之前封装Stack
和Queue
是基于数组的一样。 - 后面我们在添加字典相关的操作
- 非常简单,创建一个
二. 操作字典
常见操作
- 字典常见操作:
set(key,value)
:向字典中添加新元素。remove(key)
:通过用键值来从字典中移除键值对应的数据值。has(key)
:如果某个键值处在于这个字典中,则返回true
,反之则返回false
。get(key)
:通过键值查找特定的数值并返回。clear()
:将这个字典中所有元素全部删除。size()
:返回字典所包含元素的数量。于数组的length
属性类似。keys()
:jiang字典所包含的所有键名以数组形式返回。values()
:将字典所包含的所有数值以数组形式返回。
操作实现
-
我们将这些方法放在一起实现
// 创建字典的构造函数 function Dictionay() { // 字典属性 this.items = {} // 字典操作方法 // 在字典中添加键值对 Dictionay.prototype.has = function (key) { return this.items.hasOwnProperty(key) } // 从字典中移除元素 Dictionay.prototype.remove = function (key) { // 1.判断字典中是否有这个key if(!this.has(key)) return false // 2.从字典中删除key delete this.item[key] return true } // 根据key去获取value Dictionay.prototype.get = function (key) { return this.has(key) ? this.items[key] : undefined } // 获取所有的value Dictionay.prototype.values = function () { return Object.values(this.items) } // size方法 Dictionay.prototype.size = function () { return this.keys().length } // clear方法 Dictionay.prototype.clear = function () { this.items = {} } }
-
测试
// 创建字典对象 let dict = new Dictionqy() // 字典中添加元素 dict.set("age",18) dict.set("name","code") dict.set("heigth",1.88) dict.set("address","广州市") // 获取字典的信息 alert(dict.keys()) // age,name,heigth,address alert(dict.values()) // 18,code,1.88,广州市 alert(dict.size()) // 4 alert(dict.get("name")) //code // 字典的删除方法‘ dict.remove("heigth") alert(dict.keys()) // age,name,address // 情况字典 dict.clear()