2.3.2使用属性进行Hash索引(HACK)---(Rapid Flash Development)快速Flash开发

2.3.2使用属性进行Hash索引(HACK)---(Rapid Flash Development)快速Flash开发

by emilmatthew

最后更新:17/12/08

Hash表相信大家在开发程序时有时需要用到,比方说,我有一个用户Array,其中的单元类型是Object,单元中有userid:string,username:string,userhead:string等属性.

如果我要根据用户名或用户ID检索出某一个用户,那未,可以有以下几种方法:

a)最原始的方法,用一个for循环来做,不要嘲笑这个方法,其实有时也有用处,优点是:简单,好用.

b)用Hash表来检索,注意处理碰撞(相同的username),时间为O(1).

c)用AS3 API中Array的IndexOf方法来做,可以将用户名拷贝至NameArray来建索引.(无法处理同质(相同数据)情况)

所以,对于异质数据(无相同数据)而言,c)的方案在AS3中最为方便,而通常的网络应用,可以被用作检索的attribute基本是异质的,这是在数据库设计中决定的,比方说,用户ID.

有比c)更快的方法呢,答案是YES,这算是一个有点HACK的方法,但使用其来很容易,只要一个Object对象就行了.

 

啊,让我们回到那个叫Robert Penner小子大出风头的FLASAH MX(AS1)时代,那时,一切都是动态的,很方便,但用在大程序上,很难.

现在到了AS3时代,语法上更加规范,大规模的Flash应用层出不穷;不过,有一个类却将AS1时代的种种美好带了回来,对喽,它就是主宰AS世界的上帝类---Object.

Object对象依旧可以以动态的方式来添加属性,比方说:

Object["user_id"]=1;

看到这里,你明白Object是如何用在异质数据的Hash索引上了吗?

OK,让我们来看个例子吧:

var testArray:Array=[{id:"1234",username:"哆啦浣浣"},
{id:"1334",username:"GROW系列Flash"},
{id:"314",username:"牛年说牛"}];

var objHashList :Object=new Object();

for(var i:int=0;i<testArray.length;i++)
{
objHashList[testArray[i].id]=i;
}

trace(objHashList["1334"]); //output:1
trace(testArray[objHashList["1334"]].username); //GROW系列Flash
trace(objHashList["234"]==null); //output:true

OK,我想通过上面的例子大部分人看明白这是咋回事了,为什么要介绍这种方法呢,原因就是它比c)还要快.

示例代码中是一个十万次检索的压力测试,使用arrHashList(c)中的方法)所耗时间约是objHashList的两倍,而且使用上,objHashList会更方便些.

另外要注意的是,这里只谈了HashList的"增"这个动作,在实际的使用时,"删","改"的动作也是经常会有的,要注意的是对被索引Array执行"删","改"时,不要忘了对objHashList执行相应的动作.

OK,这篇有点HACK意味的OBJECT HASH就到这里吧;)

P.S:Rober Penner的blog:

http://www.robertpenner.com/flashblog/

--------------------------------------------------------------------------

示例代码:

http://www.xia108.com/labs/rapidFlashDev/chp2.solution/2.3.2ObjectHash/code.rar

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值