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