JavaScrip中用ES6实现Hash表

用ES6实现Hash表

首先我们需要知道hash表有哪些方法特点

特点

  • hash表示键映射值,key => val,一一对应关系

根据这个特点,我们能仿一个类似的hash表的思路就有了。

  • val用数组存储
  • 找到一种key值是否能装换数组下标
  • 数组有最大容量

根据这三点思路我们把架子搭起来,我们有基本的骨架。

class Hash {
    constructor() {  
      // 哈希表
      this.map = [];
      // 当前hash表有值的个数
      this.size = 0;
      //hash表的最长长度为64   
      this.max = 64;
    }
}

方法实现思路

  • getHash:获取map数组的下标。key => index
  • set:向hash表里面设置值(重点)
    • 首先判断当前size超过最大容量maxNum最直接返回false
    • 如果该下标有值的话直接返回,往后移
    • 如果该下标没有值就直接赋值
  • get:获取hash表的值。key => index => 找到value
  • has:判断hash表是否有没有该key。key => index => !!map[ key ]
  • delete:删除key值数据。key => index => map[ index ] = undefined和size–
  • clear:清空数据。map = []和size = 0
class Hash {
    constructor() {  
      // 哈希表
      this.map = [];
      // 当前hash表有值的个数
      this.size = 0;
      //hash表的最长长度为64   
      this.max = 64;
    }

    // 获取map数组的下标
    getHash(key) {
      let code = 0;
      for (let i = 0; i < key.length; i++) {
        code += key.charCodeAt(i);
      }
      return code % this.max;
    }

    // 向hash表里面设置值
    // key => map数组的下标 => map中的值
    set(key, val) {
      // 判断个数超过哈希表最大的长度,直接返回false 
      if (this.size >= this.max) {
        return false;
      }
      // 获取hash表下标
      let index = this.getHash(key);
      // 如果有重复的hash下标就往后移一位
      while (this.map[index]) {
        index = (index + 1) % this.max;
      }
      this.map[index] = val;
      this.size++;
    }

    // 判断改hash表是否有值
    has(key) {
      return !!this.map[this.getHash(key)];
    }

    // 通过key值获取hash的值
    get(key) {
      return this.map[this.getHash(key)];
    }

    // 删除hash表里的key值
    delete(key) {
      if (this.has(key)) {
        this.map[this.getHash(key)] = undefined;
        this.size--;
      }
    }

    // 清空hash表
    clear() {
      this.map = [];
      this.size = 0;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

影风莫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值