用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;
}
}