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 本页面传值实现代码
May 17 Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
Mar 04 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
Apr 30 Javascript
动态加载js文件简单示例
Apr 21 Javascript
使用JavaScript获取URL中的参数(两种方法)
Nov 16 Javascript
js is_valid_filename验证文件名的函数
Jul 19 Javascript
深入浅析javascript继承体系
Oct 23 Javascript
JS使用贪心算法解决找零问题示例
Nov 27 Javascript
VUE-Table上绑定Input通过render实现双向绑定数据的示例
Aug 27 Javascript
node版本管理工具n包使用教程详解
Nov 09 Javascript
jQuery实现数字华容道小游戏(实例代码)
Jan 16 jQuery
js判断在哪个浏览器打开项目的方法
Jan 21 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 CKEditor 上传图片实现代码
2009/11/06 PHP
PHP安全防范技巧分享
2011/11/03 PHP
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
真正的JQuery.ajax传递中文参数的解决方法
2011/05/28 Javascript
Jquery插件写法笔记整理
2012/09/06 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
ajax请求乱码的解决方法(中文乱码)
2014/04/10 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
jQuery实现的动态伸缩导航菜单实例
2015/05/07 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
2016/05/28 Javascript
最丑的时钟效果!js canvas时钟制作方法
2016/08/15 Javascript
JavaScript实现图片瀑布流和底部刷新
2017/01/02 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
Vue.js2.0中的变化小结
2017/10/24 Javascript
JS实现方形抽奖效果
2018/08/27 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
使用pdb模块调试Python程序实例
2015/06/02 Python
基于Python函数的作用域规则和闭包(详解)
2017/11/29 Python
Python wxpython模块响应鼠标拖动事件操作示例
2018/08/23 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
python pandas写入excel文件的方法示例
2019/06/25 Python
Python如何计算语句执行时间
2019/11/22 Python
Django celery异步任务实现代码示例
2020/11/26 Python
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
缓解脚、腿和背部疼痛:Z-CoiL鞋
2019/03/12 全球购物
二手房购房意向书范本
2014/04/01 职场文书
村长贪污检举信
2014/04/04 职场文书
报关报检委托书
2014/04/08 职场文书
党的群众路线教育实践活动通讯稿
2014/09/10 职场文书
工程部部长岗位职责
2015/02/12 职场文书
爱的教育观后感
2015/06/17 职场文书
2016年离婚协议书范文
2016/03/18 职场文书
Vue和Flask通信的实现
2021/05/19 Vue.js
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电