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 相关文章推荐
Javascript 网页黑白效果实现代码(兼容IE/FF等)
Apr 23 Javascript
js 数组操作之pop,push,unshift,splice,shift
Jan 29 Javascript
JavaScript动态创建div等元素实例讲解
Jan 06 Javascript
理解javascript中的with关键字
Feb 15 Javascript
js轮播图代码分享
Jul 14 Javascript
Angularjs的Controller间通信机制实例分析
Nov 07 Javascript
Vue.js学习之过滤器详解
Jan 22 Javascript
jQuery动态追加页面数据以及事件委托详解
May 06 jQuery
Angular2中select用法之设置默认值与事件详解
May 07 Javascript
vue-router启用history模式下的开发及非根目录部署方法
Dec 23 Javascript
vue轻量级框架无法获取到vue对象解决方法
May 12 Javascript
vue3+typescript实现图片懒加载插件
Oct 26 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
不用数据库的多用户文件自由上传投票系统(2)
2006/10/09 PHP
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
Zend Framework实现将session存储在memcache中的方法
2016/03/22 PHP
php str_replace替换指定次数的方法详解
2017/05/05 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
javascript获取元素CSS样式代码示例
2013/11/28 Javascript
javascript获取四位数字或者字母的随机数
2015/01/09 Javascript
Yarn的安装与使用详细介绍
2016/10/25 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
用jquery的attr方法实现图片切换效果
2017/02/05 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
python根据日期返回星期几的方法
2015/07/06 Python
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
python smtplib发送带附件邮件小程序
2018/05/22 Python
Django 静态文件配置过程详解
2019/07/23 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
25个CSS3动画按钮和菜单教程分享
2012/10/03 HTML / CSS
html5唤醒APP小记
2019/03/27 HTML / CSS
Skyscanner阿联酋:全球领先的旅游搜索平台
2017/11/25 全球购物
计算机应用专业应届毕业生中文求职信范文
2013/11/29 职场文书
高分子材料与工程专业推荐信
2013/12/01 职场文书
家长给孩子的表扬信
2014/01/17 职场文书
保安队长职务说明书
2014/02/23 职场文书
党的群众路线教育实践活动心得体会900字
2014/03/07 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
党的群众路线教育实践活动批评与自我批评范文
2014/10/16 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
给领导的感谢信范文
2015/01/23 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
redis限流的实际应用
2021/04/24 Redis
如何用JS实现网页瀑布流布局
2021/04/24 Javascript
Go Grpc Gateway兼容HTTP协议文档自动生成网关
2022/06/16 Golang