JavaScript中实现键值对应的字典与哈希表结构的示例


Posted in Javascript onJune 12, 2016

字典(Dictionary)的javascript实现
编程思路:

  • 使用了裸对象datastore来进行元素存储;
  • 实现了两种得到字典长度的方法,一种为变量跟踪,一种为实时计算。

代码:

function(){
  "use strict";

  function Dictionary(){
    this._size = 0;
    this.datastore = Object.create(null);
  }

  Dictionary.prototype.isEmpty = function(){
    return this._size === 0;
  };

  Dictionary.prototype.size = function(){
    return this._size;
  };

  Dictionary.prototype.clear = function(){
    for(var key in this.datastore){
      delete this.datastore[key];
    }
    this._size = 0;
  };

  Dictionary.prototype.add = function(key, value){
    this.datastore[key] = value;
    this._size++;
  };

  Dictionary.prototype.find = function(key){
    return this.datastore[key];
  };

  Dictionary.prototype.count = function(){
    var n = 0;
    for(var key in this.datastore){
      n++;
    }
    return n;
  };

  Dictionary.prototype.remove = function(key){
    delete this.datastore[key];
    this._size--;
  };

  Dictionary.prototype.showAll = function(){
    for(var key in this.datastore){
      console.log(key + "->" + this.datastore[key]);
    }
  };

  module.exports = Dictionary;
})();

散列(hashtable)的javascript实现
编程思路:

  • 以链表来解决实现开链法来解决碰撞,并使用自己写的单链表库LinkedList(详见3water之前的https://3water.com/article/86394.htm);
  • 用裸对象来存储;
  • ValuePair简单封装键值对;
  • 以模块模式组织代码;

代码:

valuePair.js

(function(){
  "use strict";

  function ValuePair(key, value){
    this.key = key;
    this.value = value;
  }

  ValuePair.prototype.toString = function(){
    return "[" + this.key + ":" + this.value + "]";
  };

  module.exports = ValuePair;

})();

hashtable.js

(function(){

  "use strict";

  var ValuePair = require("./lib/ValuePair");
  var LinkedList = require("./LinkedList");

  function Hashtable(){
    this.table = Object.create(null);
    this._size = 0;
  }

  Hashtable.prototype.isEmpty = function(){
    return this._size === 0;
  };

  Hashtable.prototype.size = function(){
    return this._size;
  };

  Hashtable.prototype.remove = function(key){
    var index = hashCode(key);

    if(this.table[index] == null){
      return false;
    }else{
      var currNode = this.table[index].getHead();
      while(currNode.next){
        currNode = currNode.next;
        if(currNode.element.key == key){
          this.table[index].remove(currNode.element);
          this._size--;
          return true;
        }
      }
      return false;
    }
  };

  Hashtable.prototype.get = function(key){
    var index = hashCode(key);

    if(this.table[index] == null){
      return null;
    }else{
      var currNode = this.table[index].getHead();
      while(currNode.next){
        currNode = currNode.next;
        if(currNode.element.key == key){
          return currNode.element;
        }
      }
      return null;
    }
  };

  Hashtable.prototype.put = function(key, value){
    var index = hashCode(key);

    if(this.table[index] == null){
      this.table[index] = new LinkedList();
    }

    var currNode = this.table[index].getHead();
    while(currNode.next){            //key若已经存在,修改value值为新值
      currNode = currNode.next;
      if(currNode.element.key == key){
        currNode.element.value = value;
        break;
      }
    }

    if(currNode.next == null && currNode.element.value != value){         //key不存在,加入新值.注意边界值
      this.table[index].add(new ValuePair(key,value));
      this._size++;
    }

    return this;
  };

  Hashtable.prototype.display = function(){
    for(var key in this.table){
      var currNode = this.table[key].getHead();
      while(currNode.next){
        currNode = currNode.next;
        console.log(currNode.element.toString());
      }
    }
  };


  /*********************** Utility Functions ********************************/

  function hashCode(key) {        //霍纳算法,质数取37
    var hashValue = 6011;
    for (var i = 0; i < key.length; i++) {
      hashValue = hashValue * 37 + key.charCodeAt(i);
    }
    return hashValue % 1019;
  }

  module.exports = Hashtable;

})();
Javascript 相关文章推荐
js中的getAttribute方法使用示例
Aug 01 Javascript
js实现绿白相间竖向网页百叶窗动画切换效果
Mar 02 Javascript
js实现TAB切换对应不同颜色的代码
Aug 31 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
Oct 26 Javascript
基于jQuery实现响应式圆形图片轮播特效
Nov 25 Javascript
jsonp跨域请求数据实现手机号码查询实例分析
Dec 12 Javascript
使用jQuery加载html页面到指定的div实现方法
Jul 13 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
Dec 14 Javascript
详解vue项目构建与实战
Jun 27 Javascript
webpack构建vue项目的详细教程(配置篇)
Jul 17 Javascript
微信小程序 高德地图路线规划实现过程详解
Aug 05 Javascript
图解JS原型和原型链实现原理
Sep 15 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
Jun 12 #Javascript
JS中常用的输出方式(五种)
Jun 12 #Javascript
Node.js环境下JavaScript实现单链表与双链表结构
Jun 12 #Javascript
JavaScript实现阿拉伯数字和中文数字互相转换
Jun 12 #Javascript
深入解析JavaScript中的arguments对象
Jun 12 #Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
Jun 12 #Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 #Javascript
You might like
php读取mysql的简单实例
2014/01/15 PHP
Ext.MessageBox工具类简介
2009/12/10 Javascript
Javascript实现CheckBox的全选与取消全选的代码
2010/07/20 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
2015/11/20 Javascript
JavaScript随机生成颜色的方法
2016/10/15 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
2016/12/07 Javascript
javascript过滤数组重复元素的实现方法
2017/05/03 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
2017/06/22 Javascript
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
JS实现json数组排序操作实例分析
2019/10/28 Javascript
node.js中npm包管理工具用法分析
2020/02/14 Javascript
详解node和ES6的模块导出与导入
2020/02/19 Javascript
Python操作列表之List.insert()方法的使用
2015/05/20 Python
Python3实现抓取javascript动态生成的html网页功能示例
2017/08/22 Python
Python文本特征抽取与向量化算法学习
2017/12/22 Python
Python实现读取Properties配置文件的方法
2018/03/29 Python
python单线程文件传输的实例(C/S)
2019/02/13 Python
django中forms组件的使用与注意
2019/07/08 Python
Python实现结构体代码实例
2020/02/10 Python
python实现AdaBoost算法的示例
2020/10/03 Python
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
新奥尔良珠宝:Mignon Faget
2020/11/23 全球购物
测控技术与仪器个人求职信范文
2013/12/30 职场文书
天猫某品牌专卖店运营计划书
2014/03/21 职场文书
蟋蟀的住宅教学反思
2014/04/26 职场文书
领导干部作风建设剖析材料
2014/10/11 职场文书
银行竞聘报告范文
2014/11/06 职场文书
安全责任书
2015/01/29 职场文书
成本会计岗位职责
2015/02/03 职场文书
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript