JAVA & XML & JAVASCRIPT & AJAX & CSS

          Web 2.0 技術儲備............

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            77 隨筆 :: 17 文章 :: 116 評論 :: 0 Trackbacks

           

            1 <script language="javascript">
            2 /**
            3 *作者 :Fantasy
            4 *Email: fantasycs@163.com
            5 *QQ   : 8635335
            6 *Blog : http://www.aygfsteel.com/fantasy
            7 *版本 :V1.1 
            8 */
            9 function HashMap()
           10 {
           11     /** Map 大小 **/
           12     var size = 0;
           13     /** 對象 **/
           14     var entry = new Object();
           15     
           16     /** 存 **/
           17     this.put = function (key , value)
           18     {
           19         if(!this.containsKey(key))
           20         {
           21             size ++ ;
           22         }
           23         entry[key] = value;
           24     }
           25     
           26     /** 取 **/
           27     this.get = function (key)
           28     {
           29         return this.containsKey(key) ? entry[key] : null;
           30     }
           31     
           32     /** 刪除 **/
           33     this.remove = function ( key )
           34     {
           35         ifthis.containsKey(key) && ( delete entry[key] ) )
           36         {
           37             size --;
           38         }
           39     }
           40     
           41     /** 是否包含 Key **/
           42     this.containsKey = function ( key )
           43     {
           44         return (key in entry);
           45     }
           46     
           47     /** 是否包含 Value **/
           48     this.containsValue = function ( value )
           49     {
           50         for(var prop in entry)
           51         {
           52             if(entry[prop] == value)
           53             {
           54                 return true;
           55             }
           56         }
           57         return false;
           58     }
           59     
           60     /** 所有 Value **/
           61     this.values = function ()
           62     {
           63         var values = new Array();
           64         for(var prop in entry)
           65         {
           66             values.push(entry[prop]);
           67         }
           68         return values;
           69     }
           70     
           71     /** 所有 Key **/
           72     this.keys = function ()
           73     {
           74         var keys = new Array();
           75         for(var prop in entry)
           76         {
           77             keys.push(prop);
           78         }
           79         return keys;
           80     }
           81     
           82     /** Map Size **/
           83     this.size = function ()
           84     {
           85         return size;
           86     }
           87     
           88     /* 清空 */
           89     this.clear = function ()
           90     {
           91         size = 0;
           92         entry = new Object();
           93     }
           94 }
           95 
           96 var map = new HashMap();
           97 
           98 /*
           99 map.put("A","1");
          100 map.put("B","2");
          101 map.put("A","5");
          102 map.put("C","3");
          103 map.put("A","4");
          104 */
          105 
          106 /*
          107 alert(map.containsKey("XX"));
          108 alert(map.size());
          109 alert(map.get("A"));
          110 alert(map.get("XX"));
          111 map.remove("A");
          112 alert(map.size());
          113 alert(map.get("A"));
          114 */
          115 
          116 /** 同時也可以把對象作為 Key **/
          117 /*
          118 var arrayKey = new Array("1","2","3","4");
          119 var arrayValue = new Array("A","B","C","D");
          120 map.put(arrayKey,arrayValue);
          121 var value = map.get(arrayKey);
          122 for(var i = 0 ; i < value.length ; i++)
          123 {
          124     //alert(value[i]);
          125 }
          126 */
          127 /** 把對象做為Key時 ,自動調用了該對象的 toString() 方法 其實最終還是以String對象為Key**/
          128 
          129 /** 如果是自定義對象 那自己得重寫 toString() 方法 否則 . 就是下面的結果 **/
          130 
          131 function MyObject(name)
          132 {
          133     this.name = name;
          134 }
          135 
          136 /**
          137 function MyObject(name)
          138 {
          139     this.name = name;
          140     
          141     this.toString = function ()
          142     {
          143         return this.name;
          144     }
          145 }
          146 **/
          147 var object1 = new MyObject("小張");
          148 var object2 = new MyObject("小名");
          149 
          150 map.put(object1,"小張");
          151 map.put(object2,"小名");
          152 alert(map.get(object1));
          153 alert(map.get(object2));
          154 map.remove("xxxxx");
          155 alert(map.size());
          156 
          157 /** 運行結果 小名 小名 size = 1 **/
          158 
          159 /** 如果改成復寫toString()方法的對象 , 效果就完全不一樣了 **/
          160 
          161 </script>
          posted on 2006-05-06 14:52 Web 2.0 技術資源 閱讀(6686) 評論(22)  編輯  收藏 所屬分類: Javascript

          評論

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性] 2006-05-06 16:39 123
          up!  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性] 2006-05-08 15:01 dennis
          很棒!  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性] 2006-05-08 23:53 Web 2.0 技術資源
          @dennis

          謝謝支持!

          這個是在我上次寫的HashMap上完全改進的~~~

          謝謝 bbs.51js.com 上的朋友提出寶貴的意見。
            回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2006-05-27 09:16
          頂個
          寫的不錯  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2006-08-02 17:22 java player
          謝謝主人。加油。  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2006-08-14 13:43 譚立平
          樓主的實現思路挺不錯,我在blog中把它改成了prototype版本的hashtable,其中修正了一個小bug ,就是刪除集合中對象的時候,如果對象不存在,那么size仍然會減1 ,整體說還是一個不錯的實現思路,呵呵,值得參考  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2006-08-15 10:48 Web 2.0 技術資源
          @譚立平

          謝謝 樓上的兄弟提出的BUG ~ 不過我自己測還沒測出這個問題......

          再次去參考了文檔 :
          /***********************************************/
          delete 運算符
          從對象中刪除一個屬性,或從數組中刪除一個元素。
          delete expression
          expression 參數是一個有效的 JScript 表達式,通常是一個屬性名或數組元素。
          說明
          如果 expression 的結果是一個對象,且在 expression 中指定的屬性存在,而該對象又不允許它被刪除,則返回 false。
          在所有其他情況下,返回 true。
          /***********************************************/
          在刪除元素的時候增加了~ this.containsKey(key) 的條件限制。
          增加了 clear 方法。
            回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2006-10-15 12:03 悠揚---靖寶華
          郁悶,對類和對象,昨天我理解錯了,今天好像是理解對了  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2006-10-22 12:08 Web 2.0 技術資源
          修正了一個嚴重的BUG .

          情況1
          var array = new Array();
          array.push("A"); array.length = 1

          情況2 (想當然的為初始化長度,以為那樣效率可以高那么一點點........)
          var array = new Array( 3 );
          array.push("A"); array.length = 4

          區別大呢............. 不像JAVA里面....

          他爺爺的~~!


            回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2008-01-09 12:55 js
          做個東西先要有實用的地方, Array自己可以帶名稱索引,可變長度,JS變量也是可變的.

          var hashTable = [];
          添加元數
          hashTable["A"] = "a";
          hashTable["B"] = object;
          得到元數
          var value = haseTable["A"];
          var value = haseTable["B"];

          所以說包含你的所有功能``沒有一點意義
          splice()就是你的remove()只是功能比你強點
          lenght就是你的size
          put(),get()直接通過索引隱式調用[""]
          另外比你多這些方法concat,join ,pop ,push,reverse,shift,slice,sort,toLocaleString  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2008-01-09 15:21 Web 2.0 技術資源
          @js

          設計這個Map 主要是為了填補 Javascript 中沒有Map工具的不足。

          你覺得你用Array 來代替 Map 那樣你寫的Javascript 會清晰明了嗎?

          那在Java里面何必需要HashSet, 直接用HashMap也能實現~

          關鍵是讓自己編碼更清晰.... 數據類型更明了。  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2008-04-24 14:33 ...
          這個具有緩存功能嗎?  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2008-04-24 14:36 fantasy
          @...

          具有緩存能力?。?
          只是看你怎么去實現了....... 你自己把握緩存的生命周期。  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現][未登錄] 2008-05-22 13:29 bobo
          支持火狐嗎?  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2008-05-23 09:41 fantasy
          支持FireFox  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2008-07-02 11:40 traveller
          @js
          這位仁兄,說別人不對的時候請先肯定自己是對的,不然很丟人現眼耶
          hashTable["A"] = "a";
          hashTable["B"] = object;
          這是Object就能提供的使用方法,而不是Array。用這種方式不會改變Array的長度,就是說你的length始終是0,"a"和object根本沒有放進Array內部的集合中,因此也是無法遍歷的。
          splice()和remove()在這沒有任何意義
          那么,你搞清楚了樓主到底要解決什么問題了嗎?  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2008-11-04 09:38 liz
          頂,寫的不錯  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2008-12-04 17:25 clue
          不小心路過...

          最近正好也自己寫了一個,你的實現還是會有些問題
          如果有框架自定義了
          Object.prototype
          當你for(var p in entry)時,會把自定義的prototype里的內容也取出來
          所以,最好定義一個PERFIX前綴來判斷是否是自己存的值
          -----------------------------
          function MyMap(){}
          MyMap.prototype = {
          _length : 0,
          _DEF_PERFIX : 'MY_MAP_KEY_',
          size : function(){return this._length},
          get : function(key){
          return this[this._DEF_PERFIX+key];
          },
          put : function(key,value){
          if(!this[this._DEF_PERFIX+key]){
          this._length++;
          }
          this[this._DEF_PERFIX+key] = value;
          return value;
          },
          remove : function(key){
          if(this._length>0 && this[this._DEF_PERFIX+key]){
          delete this[this._DEF_PERFIX+key];
          this._length--;
          return true;
          }
          return false;
          },
          getKeySet : function(){
          var retArr = [];
          for(var key in this){
          if(key.length>this._DEF_PERFIX.length && key.indexOf(this._DEF_PERFIX)==0){
          retArr.push(key.substr(this._DEF_PERFIX.length));
          }
          }
          return retArr;
          }
          }
            回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2009-01-06 17:42 Web 2.0 技術資源
          謝謝樓上的兄弟! 對頭................. 的確存在那樣的問題。
          沒考慮周全。  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2009-12-16 10:52 shouldbai
          這個在IE6里面測試過嗎?每次調用put方法都會報錯,entry is undefined  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2010-03-23 11:41 多福多壽
          好像都沒有一點哈希算法在里面 怎么算得上hashmap呢  回復  更多評論
            

          # re: [原創] Javascript 封裝 HashMap v1.1 ...... [充分利用Javascript 的特性 80 行代碼實現] 2010-05-05 11:25 tmp
          這不是 HashMap 鑒定完畢。只是對 Object 封裝一下,用處不大。  回復  更多評論
            

          主站蜘蛛池模板: 济阳县| 太仓市| 民乐县| 沈丘县| 榆中县| 蒙阴县| 松滋市| 鄢陵县| 广昌县| 建水县| 广灵县| 军事| 江口县| 华宁县| 宁津县| 林芝县| 新沂市| 台东市| 博白县| 金坛市| 德庆县| 浦东新区| 新余市| 浪卡子县| 方城县| 华宁县| 雷山县| 化隆| 和平县| 马山县| 五家渠市| 临桂县| 荆门市| 泸西县| 红河县| 烟台市| 合山市| 荆州市| 东丽区| 阜城县| 平昌县|