数据结构和算法(七)之字典结构

数据结构和算法(七)之字典结构

一. 认识字典

  • 生活中的字典
    • 中文字典我们可以根据拼音去查找汉字,并且找到汉字对应的词以及解释。
    • 英文字典也是类似,根据英文字母找到对应的单词,在查看其翻译和应用场景。
    • 很多编程语言中都有字典的概念。
  • 字典有什么特点呢?
    • 字典的主要特点是一一对应的关系。
    • 比如保存一个人的信息,在合适的情况下取出这些信息。
    • 使用数组的方式:[18,”Code”,1.88],可以通过下标值取出信息。
    • 使用字典的方式:{“age”:18,”name”:”code”,”heigth”:1.88}.可以通过key取出value
  • 字典的映射关系:
    • 有些编程语言中称这种映射关系为字典,因为他确实和生活中的字典比较相似。(比如SwiftDictionary,Python中的dict
    • 有些编程语言中称这种映射关系为Map,注意Map在这里不要翻译成地图,而是翻译成映射。(比如Java中就有HashMap&TreeMap等)
  • 字典和数组:
    • 字典和数组对比的话,字典可以非常方便的通过key来搜索对应的valuekey可以包含特殊含义,也更容易被人记住。
  • 字典和对象:
    • 很多编程语言(比如Java)中对字典和对象区分比较明显,对象通常是一种在编译期就确定下来的结构,不可以动态的添加或者删除属性。而字典通过会使用类似于哈希表的数据结构去实现一种可以动态的添加数据的结构。
    • 但是在JavaScript中,似乎对象本身就是一种字典。所以在早期的JavaScript中,没有字典这种数据类型,因为你完全可以使用对象去代替。
    • 但是这里我们还是按照其他语言经常使用字典方式去封装一个字典类型,方便我们按照其他语言的方式去使用字典。(虽然本质上它内部还是用了一个对象,后面学习完哈希表我会简单谈一下对象和哈希表的关系)

创建字典类

  • 我们向之前封装集合一样,封装一个字典的构造函数

    // 创建字典的构造函数
    function Dictionay(){
        // 字典属性
        this.item = {}
        
    }
    
  • 代码解析:

    • 非常简单,创建一个Dictionary的构造函数,用于我们字典的封装。
    • 在字典中,我们使用了一个items属性,该属性是一个Object对象。
    • 也就是我们的字典是基于Object封装的,这个不难理解:就像我们之前封装StackQueue是基于数组的一样。
    • 后面我们在添加字典相关的操作

二. 操作字典

常见操作

  • 字典常见操作:
    • 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()
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yige001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值