设为首页收藏本站订阅更新

无忧脚本

 找回密码
 加入无忧

QQ登录

只需一步,快速开始

查看: 4315|回复: 27

[原创] 比较无聊,写了一个HashTable [复制链接]

霸王龙

我是菜菜菜菜菜...鸟

Rank: 6Rank: 6

升级  59.25%

注册时间
2004-10-6
威望
1158
阅读权限
70
积分
2185
帖子
1181
精华
1
UID
17850
状态
当前离线
发表于 2007-3-13 13:20:18 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
一键分享 一键分享
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <SCRIPT LANGUAGE="JavaScript">
  <!--
        function HashTable()
        {       
                this.Items=[];
                this.Count=function(){return this.Items.length;};        //长度               
                this.DictionaryEntry=function(key,value)
                {
                        this.Key=key||null;
                        this.Value=value||null;
                }
                this.Add=function(key,value){this.Items.push(new this.DictionaryEntry(key,value));}
                this.Clear=function(){this.Items.length=0;}
                this.Remove=function(key)
                {
                        var index=this.GetIndexWithKey(key);
                        if(index>-1)        this.Items.splice(index,1);
                }
                this.GetValue=function(key)
                {
                        var index=this.GetIndexWithKey(key);
                        if(index>-1)        return this.Items[index].Value;
                }
                this.ContainsKey=function(key)
                {
                        if(this.GetIndexWithKey(key)>-1)        return true;
                        return false;
                }
                this.ContainsValue=function(value)
                {
                        if(this.GetIndexWithValue(value)>-1)        return true;
                        return false;
                }
                this.Keys=function()
                {
                        var iLen=this.Count();
                        var resultArr=[];
                        for(var i=0;i<iLen;i++)        resultArr.push(this.Items.Key);
                        return resultArr;
                }
                this.Values=function()
                {
                        var iLen=this.Count();
                        var resultArr=[];
                        for(var i=0;i<iLen;i++)        resultArr.push(this.Items.Value);
                        return resultArr;
                }
                this.IsEmpty=function(){return this.Count()==0;}
                this.GetIndexWithKey=function(key)
                {
                        var iLen=this.Count();
                        for(var i=0;i<iLen;i++)        if(this.Items.Key===key)        return i;
                        return -1;
                }
                this.GetIndexWithValue=function(value)
                {
                        var iLen=this.Count();
                        for(var i=0;i<iLen;i++)        if(this.Items.Value===value)        return i;
                        return -1;
                }
        }
        var a,b;
        a=document;
        b=a;
        var my=new HashTable();
        my.Add("name","cxp");
        my.Add("age",22);
        my.Add("sex","boy");
        for(var i in my.Items)
        {
                alert("Key:"+my.Items.Key+",Value:"+my.Items.Value);
        }
        my.Remove("age");
        alert(my.Keys());
  //-->
  </SCRIPT>
</HEAD>

<BODY>
  
</BODY>
</HTML>

高手勿见笑!:loveliness:
这里不是广告位啊,别乱点...!

霸王龙

我是菜菜菜菜菜...鸟

Rank: 6Rank: 6

升级  59.25%

注册时间
2004-10-6
威望
1158
阅读权限
70
积分
2185
帖子
1181
精华
1
UID
17850
状态
当前离线
发表于 2007-3-13 13:23:46 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
歪了,:L :L 但修改不了...
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <HTML>
  3. <HEAD>
  4.   <TITLE> New Document </TITLE>
  5.   <META NAME="Generator" CONTENT="EditPlus">
  6.   <META NAME="Author" CONTENT="">
  7.   <META NAME="Keywords" CONTENT="">
  8.   <META NAME="Description" CONTENT="">
  9.   <SCRIPT LANGUAGE="JavaScript">
  10.   <!--
  11.         function HashTable()
  12.         {       
  13.                 this.Items=[];
  14.                 this.Count=function(){return this.Items.length;};        //长度               
  15.                 this.DictionaryEntry=function(key,value)
  16.                 {
  17.                         this.Key=key||null;
  18.                         this.Value=value||null;
  19.                 }
  20.                 this.Add=function(key,value){this.Items.push(new this.DictionaryEntry(key,value));}
  21.                 this.Clear=function(){this.Items.length=0;}
  22.                 this.Remove=function(key)
  23.                 {
  24.                         var index=this.GetIndexWithKey(key);
  25.                         if(index>-1)        this.Items.splice(index,1);
  26.                 }
  27.                 this.GetValue=function(key)
  28.                 {
  29.                         var index=this.GetIndexWithKey(key);
  30.                         if(index>-1)        return this.Items[index].Value;
  31.                 }
  32.                 this.ContainsKey=function(key)
  33.                 {
  34.                         if(this.GetIndexWithKey(key)>-1)        return true;
  35.                         return false;
  36.                 }
  37.                 this.ContainsValue=function(value)
  38.                 {
  39.                         if(this.GetIndexWithValue(value)>-1)        return true;
  40.                         return false;
  41.                 }
  42.                 this.Keys=function()
  43.                 {
  44.                         var iLen=this.Count();
  45.                         var resultArr=[];
  46.                         for(var i=0;i<iLen;i++)        resultArr.push(this.Items[i].Key);
  47.                         return resultArr;
  48.                 }
  49.                 this.Values=function()
  50.                 {
  51.                         var iLen=this.Count();
  52.                         var resultArr=[];
  53.                         for(var i=0;i<iLen;i++)        resultArr.push(this.Items[i].Value);
  54.                         return resultArr;
  55.                 }
  56.                 this.IsEmpty=function(){return this.Count()==0;}
  57.                 this.GetIndexWithKey=function(key)
  58.                 {
  59.                         var iLen=this.Count();
  60.                         for(var i=0;i<iLen;i++)        if(this.Items[i].Key===key)        return i;
  61.                         return -1;
  62.                 }
  63.                 this.GetIndexWithValue=function(value)
  64.                 {
  65.                         var iLen=this.Count();
  66.                         for(var i=0;i<iLen;i++)        if(this.Items[i].Value===value)        return i;
  67.                         return -1;
  68.                 }
  69.         }
  70.         var a,b;
  71.         a=document;
  72.         b=a;
  73.         var my=new HashTable();
  74.         my.Add("name","cxp");
  75.         my.Add("age",22);
  76.         my.Add("sex","boy");
  77.         for(var i in my.Items)
  78.         {
  79.                 alert("Key:"+my.Items[i].Key+",Value:"+my.Items[i].Value);
  80.         }
  81.         my.Remove("age");
  82.         alert(my.Keys());
  83.   //-->
  84.   </SCRIPT>
  85. </HEAD>

  86. <BODY>
  87.   
  88. </BODY>
  89. </HTML>
复制代码运行代码另存代码
这里不是广告位啊,别乱点...!

使用道具 举报

超级版主

5毛发一贴,千里不留行。

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-3-13 19:03:45 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
object是天生的hashtable啊 为什么还要自己写呢?

使用道具 举报

霸王龙

我是菜菜菜菜菜...鸟

Rank: 6Rank: 6

升级  59.25%

注册时间
2004-10-6
威望
1158
阅读权限
70
积分
2185
帖子
1181
精华
1
UID
17850
状态
当前离线
发表于 2007-3-13 19:49:40 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
hashtable总有一些object没有的东西...
如:ContainsKey:loveliness:
这里不是广告位啊,别乱点...!

使用道具 举报

超级版主

5毛发一贴,千里不留行。

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-3-13 20:03:18 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
试试在object上加 也许效率会很高:victory:

使用道具 举报

Rank: 8Rank: 8

注册时间
2005-3-9
威望
1952
阅读权限
150
积分
4347
帖子
1577
精华
9
UID
24714
状态
当前离线
发表于 2007-3-13 20:08:16 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ 查看个人网站
这个HashTable好像可以插入重复key呢...
那样不会出问题吗??

使用道具 举报

Rank: 8Rank: 8

注册时间
2005-3-9
威望
1952
阅读权限
150
积分
4347
帖子
1577
精华
9
UID
24714
状态
当前离线
发表于 2007-3-13 20:09:40 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ 查看个人网站
原帖由 winter 于 2007-3-13 20:03 发表
试试在object上加 也许效率会很高:victory:


object上加有一个不好的地方是假如有个方法叫做keys(),那么就不能用"keys"作为HashTable的key了...

使用道具 举报

Rank: 8Rank: 8

注册时间
2005-3-9
威望
1952
阅读权限
150
积分
4347
帖子
1577
精华
9
UID
24714
状态
当前离线
发表于 2007-3-13 20:18:43 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ 查看个人网站
原帖由 效果 于 2007-3-13 19:49 发表
hashtable总有一些object没有的东西...
如:ContainsKey:loveliness:


ContainsKey是有的...
直接用in运算符就行了^^

例如:
var hashTable = {a:1, b:2};
alert('a' in hashTable);

使用道具 举报

超级版主

5毛发一贴,千里不留行。

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-3-13 20:26:36 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
就是哈......

使用道具 举报

超级版主

5毛发一贴,千里不留行。

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-3-13 20:36:42 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
原帖由 月影 于 2007-3-13 20:09 发表


object上加有一个不好的地方是假如有个方法叫做keys(),那么就不能用"keys"作为HashTable的key了...

用一个成员object呀 哪能往自己身上加呢:loveliness:

使用道具 举报

Rank: 8Rank: 8

注册时间
2005-3-9
威望
1952
阅读权限
150
积分
4347
帖子
1577
精华
9
UID
24714
状态
当前离线
发表于 2007-3-13 21:32:31 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ 查看个人网站
来个“月版”的HashTable ^^
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <HTML>
  3. <HEAD>
  4.   <TITLE> New Document </TITLE>
  5.   <META NAME="Generator" CONTENT="EditPlus">
  6.   <META NAME="Author" CONTENT="">
  7.   <META NAME="Keywords" CONTENT="">
  8.   <META NAME="Description" CONTENT="">
  9.   <SCRIPT LANGUAGE="JavaScript">
  10.   <!--
  11.         function HashTable()
  12.         {       
  13.                 //private fields
  14.                 var items = [];  

  15.                 //public methods
  16.                 this.count = function(){return items.length};

  17.                 this.any = function(closure, set){       
  18.                        
  19.                         set = set || false;
  20.                         closure = closure || function(){};
  21.                         var args = Array.apply(this, arguments).slice(2);

  22.                         for(var i = 0;i < items.length;i++){
  23.                                 var rval = closure.apply(this, [items[i].key, items[i].value].concat(args).concat(i));

  24.                                 if(rval || rval === 0){
  25.                                         if(set && set.put)
  26.                                                 set.put(rval);
  27.                                         else
  28.                                                 return rval;
  29.                                 }
  30.                         }

  31.                         return set;
  32.                 }

  33.                 this.each = function(closure){
  34.                         var set = [];
  35.                         set.put = set.push;
  36.                         return this.any(closure, set);
  37.                 }

  38.                 this.add = function(key, value){
  39.                         var item = items[this.any(function(k, v, i){if(k == key) return i})] || {key:key, value:value};
  40.                         items.push(item);
  41.                 }

  42.                 this.getValue = function(key){
  43.                         return this.any(function(k, v){if(k == key) return v});
  44.                 }

  45.                 this.containsKey = function(key){
  46.                         return this.any(function(k, v){if(k == key) return true});
  47.                 }

  48.                 this.containsValue = function(value){
  49.                         return this.any(function(k, v){if(v == value) return true});
  50.                 }

  51.                 this.remove = function(key){
  52.                         items = this.each(function(k, v){return k != key ? {key:k, value:v} : null});
  53.                 }

  54.                 this.clear = function(){items.length = 0};

  55.                
  56.                 this.keys = function(){
  57.                         return this.each(function(k, v){return k});
  58.                 }

  59.                 this.values = function(){
  60.                         return this.each(function(k, v){return v});
  61.                 }

  62.                 this.isEmpty = function(){return this.count() == 0};

  63.                 this.indexOfKey=function(key)
  64.                 {
  65.                         var idx = this.any(function(k, v, i){if(k == key) return i});
  66.                         return idx || -1;
  67.                 }

  68.                 this.indexOfValue=function(value)
  69.                 {
  70.                         var idx = this.any(function(k, v, i){if(v == value) return i});
  71.                         return idx || -1;
  72.                 }
  73.                
  74.                 this.toArray = function()
  75.                 {
  76.                         return items;
  77.                 }

  78.                 this.iterator = function()
  79.                 {
  80.                         var idx = 0, it = {};
  81.                         it.next = function(){
  82.                                 return items[idx++];
  83.                         }
  84.                         it.hasNext = function(){
  85.                                 return idx == items.length;
  86.                         }
  87.                         return it;
  88.                 }
  89.         }
  90.         var my=new HashTable();
  91.         my.add("name","cxp");
  92.         my.add("age",22);
  93.         my.add("sex","boy");

  94.         var arr = my.toArray();
  95.        
  96.         for(var i in arr)
  97.         {
  98.                 alert("Key:"+arr[i].key+",Value:"+arr[i].value);
  99.         }
  100.        
  101.         my.remove("age");
  102.         alert(my.keys());
  103.         alert(my.values());

  104.         var it = my.iterator();
  105.         var o;
  106.         while(o = it.next())
  107.         {
  108.                 alert("Key:"+o.key+",Value:"+o.value);
  109.         }
  110.   //-->
  111.   </SCRIPT>
  112. </HEAD>

  113. <BODY>
  114.   
  115. </BODY>
  116. </HTML>
复制代码运行代码另存代码

使用道具 举报

Rank: 4

升级  12%

注册时间
2005-7-4
威望
342
阅读权限
50
积分
560
帖子
338
精华
0
UID
32205
状态
当前离线
发表于 2007-3-13 21:55:01 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
弱弱问一句, 这样做意义何在?
小娘子, 你就依了我吧!

使用道具 举报

超级版主

5毛发一贴,千里不留行。

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-3-13 21:56:05 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
this.each 月版的标志方法^^
这个还是用数组的哈
object最大的问题在于没法移除 刚想到的 好像object的内部实现就是hash表

使用道具 举报

Rank: 8Rank: 8

注册时间
2005-3-9
威望
1952
阅读权限
150
积分
4347
帖子
1577
精华
9
UID
24714
状态
当前离线
发表于 2007-3-13 22:27:32 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ 查看个人网站
原帖由 winter 于 2007-3-13 21:56 发表
this.each 月版的标志方法^^
这个还是用数组的哈
object最大的问题在于没法移除 刚想到的 好像object的内部实现就是hash表


怎么会没法移出涅??
delete操作符就是用来干这个的呀!!
你可别把js的delete操作符认为是C++中的delete操作符一样的意思了
那可就大错特错了!

使用道具 举报

Rank: 8Rank: 8

注册时间
2005-3-9
威望
1952
阅读权限
150
积分
4347
帖子
1577
精华
9
UID
24714
状态
当前离线
发表于 2007-3-13 22:29:43 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ 查看个人网站
原帖由 winter 于 2007-3-13 21:56 发表
this.each 月版的标志方法^^
这个还是用数组的哈
object最大的问题在于没法移除 刚想到的 好像object的内部实现就是hash表


object最大的问题不是没法移除...
而是比如正好key叫做"propertyIsEnumerable"或者"isPrototypeOf"
结果就没法用for...in枚举出来了
这个不是比较郁闷嘛...^^

使用道具 举报

超级版主

5毛发一贴,千里不留行。

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-3-13 22:29:50 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
delete?听说过 没用过 无知了哈:P

使用道具 举报

霸王龙

我是菜菜菜菜菜...鸟

Rank: 6Rank: 6

升级  59.25%

注册时间
2004-10-6
威望
1158
阅读权限
70
积分
2185
帖子
1181
精华
1
UID
17850
状态
当前离线
发表于 2007-3-14 09:25:01 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
原帖由 月影 于 2007-3-13 20:08 发表
这个HashTable好像可以插入重复key呢...
那样不会出问题吗??

真该死,连这点都忘记了,呵呵,
改正一下:

this.Add=function(key,value)
                {
                        var index=this.GetIndexWithKey(key);
                        if(index<0)        this.Items.push(new this.DictionaryEntry(key,value));
                        else        this.Items[index].Value=value;
                }
如果存在就修改:lol
这里不是广告位啊,别乱点...!

使用道具 举报

霸王龙

我是菜菜菜菜菜...鸟

Rank: 6Rank: 6

升级  59.25%

注册时间
2004-10-6
威望
1158
阅读权限
70
积分
2185
帖子
1181
精华
1
UID
17850
状态
当前离线
发表于 2007-3-14 09:28:20 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
原帖由 winter 于 2007-3-13 19:03 发表
object是天生的hashtable啊 为什么还要自己写呢?


HashTable本身要的就是一种数据结构,

object这种东西确实是有点像hashtable的功能,

但它不===hashtable

如果用object来模拟倒是可行的!:lol
这里不是广告位啊,别乱点...!

使用道具 举报

霸王龙

我是菜菜菜菜菜...鸟

Rank: 6Rank: 6

升级  59.25%

注册时间
2004-10-6
威望
1158
阅读权限
70
积分
2185
帖子
1181
精华
1
UID
17850
状态
当前离线
发表于 2007-3-14 09:30:59 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
原帖由 比尔熊 于 2007-3-13 21:55 发表
弱弱问一句, 这样做意义何在?

创建字典键/值
IE有自带,FF下没有
这里不是广告位啊,别乱点...!

使用道具 举报

Rank: 2

升级  40%

注册时间
2005-1-17
威望
58
阅读权限
20
积分
110
帖子
43
精华
0
UID
22553
状态
当前离线
发表于 2007-3-14 09:35:27 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
以前用过 Scripting.Dictionary,这次长见识了

使用道具 举报

您需要登录后才可以回帖 登录 | 加入无忧

Archiver|手机版|无忧脚本 ( 苏ICP备05080427号 )|值班电话:027-62300445  

GMT+8, 2012-2-7 21:33 , Processed in 0.063791 second(s), 14 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 1999-2011 无忧脚本

回顶部