JAVA & XML & JAVASCRIPT & AJAX & CSS

Web 2.0 技术储备............

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  77 随笔 :: 17 文章 :: 116 评论 :: 0 Trackbacks

  1 <script language="javascript">
  2 function init()
  3 {
  4     /** 建议初始化长度  否则重散列总是消耗时间的 **/
  5     var map = new HashMap(10);
  6     for(var i = 0 ; i < 10 ; i++)
  7     {
  8         map.put("Key : " + i , "Value : " + i);
  9     }
 10     
 11     for(var i = 0 ; i < 10 ; i++)
 12     {
 13         //alert(map.get("Key : " + i));
 14     }
 15     
 16     var keys = map.keys();
 17     
 18     for(var i = 0 ; i < keys.length ; i++)
 19     {
 20         //alert(keys[i]);
 21     }
 22     
 23     var values = map.values();
 24     for(var i = 0 ; i < values.length ; i++)
 25     {
 26         //alert(values[i]);
 27     }
 28     //alert(map.containsKey("Key : 10"));
 29     alert(map.containsValue("Value : 5"));
 30 }
 31 
 32 
 33 /**
 34  *作者 :Fantasy
 35  *Email: fantasycs@qq.com
 36  *QQ   : 8635335
 37  *Blog : http://www.blogjava.net/fantasy
 38  *版本 :V1.0 
 39  */
 40 function HashMap()
 41 {
 42     /** 元素个数 **/
 43     var size = 0;
 44     /** 容器最大长度默认 256 **/
 45     var length = arguments[0? arguments[0] : 256;
 46     /**  存放Entry的线性数组 **/
 47     var list = new Array(length);
 48     
 49     /** 存放键值 **/
 50     this.put = function(key,value)
 51     {
 52         /** 装填因子大于0.75重新散列 **/
 53         if(size/length > 0.75)
 54         {
 55             resize(this);
 56         }
 57         
 58         var counter = 0;
 59         var code = getHashCode(key);
 60         while(counter++ < length)
 61         {
 62             if(typeof list[code] == "undefined")
 63             {
 64                 size  = size + 1;
 65                 list[code] = new Entry(key,value);
 66                 break;
 67             }
 68             else if(list[code].key == key )
 69             {
 70                 list[code].value = value;
 71                 break;
 72             }
 73             
 74             if(++code > length)
 75             {
 76                 code = 0;
 77             }
 78         }
 79     }
 80     
 81     /** 获取Key值 **/
 82     this.get = function(key)
 83     {
 84         var counter = 0;
 85         var code = getHashCode(key);
 86         while(counter++ < length)
 87         {
 88             if(typeof list[code] != "undefined")
 89             {
 90                 if( list[code].key == key )
 91                 {
 92                     return list[code].value;
 93                 }
 94             }
 95             else
 96             {
 97                 return null;
 98             }
 99             
100             if(++code > length)
101             {
102                 code = 0;
103             }
104         }
105     }
106     
107     /** 返回所有的 Value **/
108     this.values = function ()
109     {
110         var values = new Array();
111         for(var i = 0 ; i < length ; i++)
112         {
113             if(typeof list[i] != "undefined" )
114             {
115                 values.push(list[i].value);
116             }
117         }
118         return values;    
119     }
120     
121     /** 返回所有的 Key **/
122     this.keys = function ()
123     {
124         var keys = new Array();
125         for(var i = 0 ; i < length ; i++)
126         {
127             if(typeof list[i] != "undefined" )
128             {
129                 keys.push(list[i].key);
130             }
131         }
132         return keys;    
133     }
134     
135     /** 返回元素个数 **/
136     this.size = function ()
137     {
138         return size;
139     }
140     
141     /** 集合中是否存在 KEY **/
142     this.containsKey = function (key)
143     {
144         var counter = 0;
145         var code = getHashCode(key);
146         while(counter++ < length)
147         {
148             if(typeof list[code] != "undefined")
149             {
150                 if( list[code].key == key )
151                 {
152                     return true;
153                 }
154             }
155                     
156             if(++code > length)
157             {
158                 code = 0;
159             }
160         }
161         return false;
162     }
163     
164     /** 集合中是否存在 Value **/
165     this.containsValue = function (value)
166     {
167         for(var i = 0 ; i < length ; i++)
168         {
169             if(typeof list[i] != "undefined" )
170             {
171                 if(list[i].value == value)
172                 {
173                     return true;
174                 }
175             }
176         }
177         return false;
178     }
179     
180     /** 内部类 键值对应关系 **/
181     var Entry = function (key,value)
182     {
183         this.key = key;
184         this.value = value;
185     }
186     
187     /** Hash 函数 [估计随机性不好. 建议高手自己写] **/
188     var getHashCode = function(key)
189     {
190         var hashCode = (key.charCodeAt(0* key.charCodeAt(key.length - 1)) % length;
191         return hashCode;
192     }
193     
194     /** size / length > 0.75 装填因子大于0.75重新散列 [浪费时间的东东..]**/
195     var resize = function ( _this )
196     {
197         var entryList = new Array();
198         /** 暂存 list **/
199         for(var i = 0 ; i < length ; i++)
200         {
201             if(typeof list[i] != "undefined" )
202             {
203                 entryList.push(list[i]);
204             }
205         }
206         /** 长度扩大为原来2倍 **/
207         length = length * 2;
208         list = new Array(length);
209         /** 元素个数置 0 **/
210         size = 0;
211         /** 重散列**/
212         for(var i = 0 ; i < entryList.length ; i++)
213         {
214             var entry = entryList[i];
215             _this.put(entry.key , entry.value);    
216         }
217     }    
218 }
219 </script>


其实连 Map ..... 的所有接口都没实现......... 算半个  Map 吧........ 呵呵。 ^_^

目前只写了这些方法................ 如果有什么问题请大家提出来~~~~ 偶先谢谢拉。

目前存在的问题 : 1. 只能使用 String .......... 做为Key。
                                2. 没有做数据效验。
                                3. 有的 While 循环 改为 for 循环简洁点 ....... [现在才发现.. 不知道当时怎么想的哟.... 55555]

posted on 2006-04-17 22:29 Web 2.0 技术资源 阅读(1660) 评论(4)  编辑  收藏 所属分类: Javascript

评论

# re: [原创] 用 Javascript 封装了一个HashMap ..... 希望大家多多指教! 2006-04-18 00:09 unrealwalker@gmail.com
get和put里的
if(++code > length){
code = 0;
}
干什么用?hashcode居然和length绑在一起,感觉很怪。。。
resize要个_this参数干嘛用?
key允许空值但hashcode方法却没有对其进行空值检查?
resize......对Javascript不是很熟也不知道怎样效率更高,总感觉这样倒来倒去不如再新建一个定长数组?  回复  更多评论
  

# re: [原创] 用 Javascript 封装了一个HashMap ..... 希望大家多多指教! 2006-04-18 09:12 Web 2.0 技术资源
/**
if(++code > length){
code = 0;
}
干什么用?hashcode居然和length绑在一起,感觉很怪。。。
**/

因为如果当前位置发生冲突.......... 则向后查找.. 如果 > length 则 置0 。  回复  更多评论
  

# re: [原创] 用 Javascript 封装了一个HashMap ..... 希望大家多多指教! 2006-04-18 09:15 Web 2.0 技术资源
/**
resize要个_this参数干嘛用?
**/

是为了解决 用 var 定义的方法不能调用 this 方法... [私有不能访问公有方法]

所以得显示的传递一个 this 对象。  回复  更多评论
  

# re: [原创] 用 Javascript 封装了一个HashMap ..... 希望大家多多指教! 2006-04-18 09:23 Web 2.0 技术资源
/** key允许空值但hashcode方法却没有对其进行空值检查? **/

这个的确是问题............. 但是我不想考虑太多的因素进去......
我觉得那些应该由用户自己来检查.....

否则会让正个代码变得很郁闷........... 郁闷拉。 55555555555  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: