您的位置:首页 > Web前端 > JavaScript

使用javascript模拟了一个类似Java的HashMap类

2008-04-02 00:27 615 查看
导读:
  * 模拟简单HashMap类,要求key是String,value可以是任何类型
  * 方法列表:
  * 1,HashMap() : 构造函数
  * 2, put(key, value) : void
  * 3, get(key) : Object
  * 4, keySet() : Array
  * 5, values() : Array
  * 6, size() : int
  * 7, clear() : void
  * 8, isEmpty() : boolean
  * 9, containsKey(key) : boolean
  * 10, containsValue(value) : boolean //如果value是Object类型或者数组类型,存在bug
  * 11, putAll(map) : void
  * 12, remove(key) : void
  * 用法:
  * var map = new JHashMap();
  * map.put("one","一只小猪");
  * map.put("two","两只小猪");
  * map.put("three","三只小猪");
  *
  * print("[ toString() ] : "+ map);
  * print("[ get() ] : "+ map.get("one"));
  * print("[ keySet() ] : "+ map.keySet());
  * print("[ values() ] : "+ map.values());
  * print("[ size() ] : "+ map.size());
  * print("[ isEmpty() ] : "+ map.isEmpty());
  * print("[ containsKey() ] : "+ map.containsKey("one"));
  * print("[ containsValue() ] : "+ map.containsValue("三只小猪"));
  *
  * //putAll
  * var mapTemp = new JHashMap();
  * mapTemp.put("four","四只小猪");
  * mapTemp.put("five","五只小猪");
  * map.putAll(mapTemp);
  * print("[ putAll() ] : "+ map);
  *
  * //remove
  * map.remove("two");
  * map.remove("one");
  * print("[ remove() ] : "+ map);
  *
  * //clear
  * map.clear()
  * print("[ clear() ] : "+ map.size());
  * //辅助方法
  * function print(msg)
  * {
  * document.write(msg + "");
  * }
  * 修改履历:
  -------------------------------------------------------------------------------*/

  /**
  * HashMap构造函数
  */
  function JHashMap()
  {
  this.length = 0;
  this.prefix = "hashmap_prefix_20040716_";
  }
  /**
  * 向HashMap中添加键值对
  */
  JHashMap.prototype.put = function (key, value)
  {
  this[this.prefix + key] = value;
  this.length ++;
  }
  /**
  * 从HashMap中获取value值
  */
  JHashMap.prototype.get = function(key)
  {
  return typeof this[this.prefix + key] == "undefined"
   null : this[this.prefix + key];
  }
  /**
  * 从HashMap中获取所有key的集合,以数组形式返回
  */
  JHashMap.prototype.keySet = function()
  {
  var arrKeySet = new Array();
  var index = 0;
  for(var strKey in this)
  {
  if(strKey.substring(0,this.prefix.length) == this.prefix)
  arrKeySet[index ++] = strKey.substring(this.prefix.length);
  }
  return arrKeySet.length == 0 ? null : arrKeySet;
  }
  /**
  * 从HashMap中获取value的集合,以数组形式返回
  */
  JHashMap.prototype.values = function()
  {
  var arrValues = new Array();
  var index = 0;
  for(var strKey in this)
  {
  if(strKey.substring(0,this.prefix.length) == this.prefix)
  arrValues[index ++] = this[strKey];
  }
  return arrValues.length == 0 ? null : arrValues;
  }
  /**
  * 获取HashMap的value值数量
  */
  JHashMap.prototype.size = function()
  {
  return this.length;
  }
  /**
  * 删除指定的值
  */
  JHashMap.prototype.remove = function(key)
  {
  delete this[this.prefix + key];
  this.length --;
  }
  /**
  * 清空HashMap
  */
  JHashMap.prototype.clear = function()
  {
  for(var strKey in this)
  {
  if(strKey.substring(0,this.prefix.length) == this.prefix)
  delete this[strKey];
  }
  this.length = 0;
  }
  /**
  * 判断HashMap是否为空
  */
  JHashMap.prototype.isEmpty = function()
  {
  return this.length == 0;
  }
  /**
  * 判断HashMap是否存在某个key
  */
  JHashMap.prototype.containsKey = function(key)
  {
  for(var strKey in this)
  {
  if(strKey == this.prefix + key)
  return true;
  }
  return false;
  }
  /**
  * 判断HashMap是否存在某个value
  */
  JHashMap.prototype.containsValue = function(value)
  {
  for(var strKey in this)
  {
  if(this[strKey] == value)
  return true;
  }
  return false;
  }
  /**
  * 把一个HashMap的值加入到另一个HashMap中,参数必须是HashMap
  */
  JHashMap.prototype.putAll = function(map)
  {
  if(map == null)
  return;
  if(map.constructor != JHashMap)
  return;
  var arrKey = map.keySet();
  var arrValue = map.values();
  for(var i in arrKey)
  this.put(arrKey[i],arrValue[i]);
  }
  //toString
  JHashMap.prototype.toString = function()
  {
  var str = "";
  for(var strKey in this)
  {
  if(strKey.substring(0,this.prefix.length) == this.prefix)
  str += strKey.substring(this.prefix.length)
  + ": "+ this[strKey] + "/r/n";
  }
  return str;
  }
  
  你相当于是用对象的属性可增可减来模拟HashMap的key和value的集合的。
  但你有一点点忽视的问题。当
  页面定义了Object.prototype时,你在for( var p in this )时会将Object.prototype也纳入其中。
  如果是我设计,我会做成:
  function HashMap()
  {
  this.key = [];
  this.value = [];
  }做成2个集合的形式。

本文转自
http://www.busfly.cn/CSDN/post/535.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐