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小技巧之生成html元素
May 15 Javascript
JavaScript设计模式之工厂方法模式介绍
Dec 28 Javascript
ionic开发中点击input时键盘自动弹出
Dec 23 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
Dec 24 Javascript
jQuery实现拖拽可编辑模块功能代码
Jan 12 Javascript
vue-loader教程介绍
Jun 14 Javascript
js实现省市级联效果分享
Aug 10 Javascript
原生JS获取元素的位置与尺寸实现方法
Oct 18 Javascript
用node开发并发布一个cli工具的方法步骤
Jan 03 Javascript
如何从零开始手写Koa2框架
Mar 22 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
Sep 05 Javascript
JavaScript实现HTML导航栏下拉菜单
Nov 25 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新手用的Insert和Update语句构造类
2012/03/31 PHP
使用PHP和HTML5 FormData实现无刷新文件上传教程
2014/09/06 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
jquery ajax 检测用户注册时用户名是否存在
2009/11/03 Javascript
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
最佳的addEvent事件绑定是怎样诞生的
2011/10/24 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
用jquery.sortElements实现table排序
2014/05/04 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
js 调用百度分享功能
2017/02/27 Javascript
JavaScript和JQuery获取DIV值的方法示例
2017/03/07 Javascript
详解Webpack + ES6 最新环境搭建与配置
2018/06/04 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
2019/06/24 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
2020/11/07 Javascript
使用Typescript开发微信小程序的步骤详解
2021/01/12 Javascript
python使用Berkeley DB数据库实例
2014/09/26 Python
Python栈算法的实现与简单应用示例
2017/11/01 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
浅析python3字符串格式化format()函数的简单用法
2018/12/07 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
Python turtle绘画象棋棋盘
2019/08/21 Python
浅谈pycharm使用及设置方法
2019/09/09 Python
Python的缺点和劣势分析
2019/11/19 Python
医科大学生的自我评价
2013/12/04 职场文书
五好党支部事迹材料
2014/02/06 职场文书
抄作业检讨书
2014/02/17 职场文书
校园联欢晚会主持词
2014/03/17 职场文书
演讲稿格式
2014/04/30 职场文书
土木工程求职信
2014/05/29 职场文书
高三英语复习计划
2015/01/19 职场文书
2016暑期政治学习心得体会
2016/01/23 职场文书
应用最多的公文《通知》如何写?
2019/04/02 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang
日元符号 ¥
2022/02/17 杂记
Go语言特点及基本数据类型使用详解
2022/03/21 Golang