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获取url参数的使用扩展实例
Dec 29 Javascript
Firebug 字幕文件JSON地址获取代码
Oct 28 Javascript
另一个javascript小测验(代码集合)
Jul 27 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
Apr 16 Javascript
javascript格式化json显示实例分析
Apr 21 Javascript
基于javascript数组实现图片轮播
May 02 Javascript
jQuery图片轮播插件——前端开发必看
May 31 Javascript
Asp.Net之JS生成分页条的方法
Nov 23 Javascript
微信小程序视图template模板引用的实例详解
Sep 20 Javascript
微信小程序开发摇一摇功能
Nov 22 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
Oct 02 Javascript
JavaScript实现跟随鼠标移动的盒子
Jan 28 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获取http请求的头信息实现步骤
2012/12/16 PHP
PHP命名空间(Namespace)的使用详解
2013/05/04 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
php操作access数据库的方法详解
2017/02/22 PHP
PHP Cli 模式设置进程名称的方法
2019/06/12 PHP
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
基于Asp.net与Javascript控制的日期控件
2010/05/22 Javascript
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
JavaScript实现把数字转换成中文
2015/06/29 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
基于jQuery实现返回顶部实例代码
2016/01/01 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
JavaScript数据推送Comet技术详解
2016/04/07 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
2017/08/14 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
2019/09/17 Javascript
vue开发中遇到的问题总结
2020/04/07 Javascript
在Vue 中获取下拉框的文本及选项值操作
2020/08/13 Javascript
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
python根据unicode判断语言类型实例代码
2018/01/17 Python
深入理解Python 关于supper 的 用法和原理
2018/02/28 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
Python WEB应用部署的实现方法
2019/01/02 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
澳大利亚百货商店中销量第一的商务衬衫品牌:Van Heusen
2018/07/26 全球购物
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
MIS软件工程师的面试题
2016/04/22 面试题
证婚人搞笑证婚词
2014/01/10 职场文书
2014自荐信的写作技巧
2014/01/28 职场文书
计划生育宣传标语
2014/06/21 职场文书
酒店优秀员工推荐信
2015/03/24 职场文书
基于Python实现的购物商城管理系统
2021/04/27 Python