第十七章:哈希表(Hashtable)——基础语句
PS:请结合十六章一起看。
其实呢~ 如果你被套了魔免盾后没有出现排斥现象的话~
那么恭喜这位同学,你已经会用哈希表在一个函数里绑定单位到计时器,并在另一个函数里等计时器到期后读取被绑定的单位并命令这个单位做动作了。当然了,还不止~ 你连哈希表的排泄都已经学会了~
好吧。。要是光看那个就能学会大家也不用那么辛苦了。。
现在让我们将第十六章中的故事翻译成J:
首先要理解下什么是哈希表:那个装本子的箱子就是哈希表,那些本子贴的标签叫哈希表的主目录(也有叫父目录之类的),本子的页码叫哈希表的子目录,最后每页记录的人名就是被记录在哈希表的主目录中的子目录中的值了。
至于管理员呢。。就是电脑
比如说我们在地图里放了个单位名字叫A(A就是这个单位的全局变量名,放到地图上WE会自动为其编个号)
然后试着用哈希表完成下面这三件事:
1. 将A存到一个哈希表的1号主目录1号子目录下
2. 从这个哈希表的1号主目录1号子目录中读取A
3. 将A从这个哈希表的1号主目录1号子目录中删除
第一步,我们需要初始化一个哈希表并为其取个名字:- globals
- hashtable ht=InitHashtable()
- endglobals
复制代码
初始化哈希表一般就用全局变量初始化一个就够了,要存不同的东西完全可以存在一个哈希表的不同目录下。
然后就是储存这个单位:
- globals
- hashtable ht=InitHashtable()
- endglobals
- function Save takes unit A returns nothing
- call SaveUnitHandle( ht, 1, 1, A )
- endfunction
复制代码
额。。SaveUnitHandle()这个函数不是翻翻字典就能理解的,所以我解释下,前面两个单词很好理解,Save(储存)和Unit(单位);关键是最后一个单词,Handle(手柄、把柄),在第十四章最后部分有提过,除了integer、real、boolean、string之外,都是指针型的数据,所谓指针型数据都是只有一个整数作为地址,然后这些数据就像个路标指针一样指向这个地址,所以叫指针型数据(比如一个农民,其实并没有“农民”这样的数据,而是以一个整数作为数据,然后这个农民就是指向这个整数的指针)
那么这里Handle的意思就是指这个单位的整数地址。
顺带一提,即使数据类型相同,比如都是单位,但是不同的单位整数地址也是不同的。
要举一反三就很简单了,比如储存特效X:
- call SaveEffectHandle( ht, 1, 1, X )
复制代码
如果不是指针型的呢,去掉Handle就行了,比如储存实数8.0
- call SaveReal( ht, 1, 1, 8.0 )
复制代码
第二步读取:
就是在函数中使用LoadUnitHandle()等这种函数,但是一般读取出来为了方便使用,就直接用变量赋值。
- function Load takes nothing returns nothing
- local unit u=LoadUnitHandle( ht, 1, 1 )
- endfunction
复制代码
在这个函数中就讲ht中主目录1的子目录1的单位地址读取出来,但后赋值给局部变量u
虽然单位地址之前说过是整数,但是那只是个地址,实际读取出来的是这个单位。
最后一步就是删除哈希表里这个储存的单位了:
- call RemoveSavedHandle( ht, 1, 1 )
复制代码
既然单位是指针型数据,也就是有handle,那么管它是什么数据的handle,反正都是handle,直接删handle就行,其它的不是handle型的数据,就要区别开来。
- call RemoveSavedInteger( ht,1,1 )
- call RemoveSavedReal( ht, 1, 1 )
- call RemoveSavedString( ht, 1, 1 )
- call RemoveSavedBoolean( ht, 1, 1 )
复制代码
删除一个主目录下所有的子目录:
- call FlushChildHashtable( ht, 1 )
复制代码
也就是把主目录1的所有子目录删除了
如果要清理整个哈希表的话,也就是将所有的主目录删除:
- call FlushParentHashtable( ht )
复制代码
|