除了数组之外,果壳精灵还支持多种数据格式,例如链表、哈希表(字典)、AVL树,以及自定义的数据类型和类(面向对象编程)。
哈希表在其他语言里也叫字典或者MAP,这种数据结构类似数组,但不使用数字来表示子元素数据,而是使用一个字符串来表示子元素。
这就赋予了哈希表更强大的灵活性,但这也让哈希表在使用的时候比数组稍微麻烦一些。
哈希表使用一个字符串爱表示元素索引,它的值也是一个字符串,因此这种数据被称为键值对数据,键就是子元素的名字,值就是子元素的数据。
要使用哈希表,首先我们需要使用【Hash_New】函数创建一个哈希表,这个函数需要传递一个参数,来表示这个哈希表预申请的数据数量,我们可以传递 0,这样它会使用一个最小值 100 来代替它:
Function Main() As Long Dim 哈希表 As Table = Hash_New(0) End Function
创建完哈希表之后,我们就可以设置和获取哈希表的数据了:
Function Main() As Long Dim 哈希表 As Table = Hash_New(0) Hash_Set(哈希表, "Key", "Value") TracePrint Hash_Get(哈希表, "Key") End Function
通过【Hash_Count】可以获取哈希表中键值对的数量:
Function Main() As Long Dim 哈希表 As Table = Hash_New(0) Hash_Set(哈希表, "Key", "Value") TracePrint Hash_Count(哈希表) End Function
也可以删除一个键值对:
Function Main() As Long Dim 哈希表 As Table = Hash_New(0) Hash_Set(哈希表, "Key", "Value") Hash_Del(哈希表, "Key") TracePrint Hash_Count(哈希表) End Function
要遍历一个哈希表比较麻烦,但也是能够做到的:
Function Main() As Long Dim 哈希表 As Table = Hash_New(0) Hash_Set(哈希表, "Key1", "Value1") Hash_Set(哈希表, "Key2", "Value2") Hash_Set(哈希表, "Key3", "Value3") Dim sKeys As String = Hash_GetKeys(哈希表, "|") Dim arrKeys() As String Split(sKeys, "|", arrKeys) For i As Long = 1 To UBound(arrKeys) TracePrint arrKeys(i) & " : " & Hash_Get(哈希表, arrKeys(i)) Next End Function
哈希表需要在不再使用的时候释放掉,否则会一直占着一块内存,如果在循环里不停的创建哈希表不释放的话,电脑的内存可能会被快速占满,因此养成良好的编程习惯,你的程序才会更加稳定:
Function Main() As Long Dim 哈希表 As Table = Hash_New(0) Hash_Set(哈希表, "Key1", "Value1") Hash_Set(哈希表, "Key2", "Value2") Hash_Set(哈希表, "Key3", "Value3") Dim sKeys As String = Hash_GetKeys(哈希表, "|") Dim arrKeys() As String Split(sKeys, "|", arrKeys) For i As Long = 1 To UBound(arrKeys) TracePrint arrKeys(i) & " : " & Hash_Get(哈希表, arrKeys(i)) Next Hash_Free(哈希表) End Function
关于哈希表的操作函数,在【命令大全 - 标准库 - 哈希表操作】分类下。
链表是一组数据相互链接组成的表数据结构,它和数组很类似,但每个元素都额外记住了它的前一个元素和后一个元素。
因此这种表的插入操作非常灵活,而且速度很快。
在学习初期不需要对这种数据类型太过在意,它主要用于特定需要优化的场合。
链表相对来说没有哈希表那么常用,关于链表的操作函数,在【命令大全 - 标准库 - 链表操作】分类下。
AVL树实际上并不是一种真正的树形数据结构,而是利用AVL树来加速查表的类似哈希表的数据结构。
你可以理解为这是一种二分查找法来加速查找元素速度的哈希表,这种数据的查表速度非常快,也是用于特定优化场合的。
平时可以将它当做哈希表使用,而且 AVL 树的遍历操作比哈希表更简单:
Function Main() As Long Dim AVL As AVLTree = Tree_New() Tree_Set(AVL, "Key1", "Value1") Tree_Set(AVL, "Key2", "Value2") Tree_Set(AVL, "Key3", "Value3") Dim pNode As Long = Tree_First(AVL) Do Until pNode = 0 TracePrint Tree_GetData(pNode) pNode = Tree_Next(pNode) Loop End Function
在操作上,AVL树有点类似于链表 + 哈希表的组合,可以从前向后遍历,也可以从后向前遍历:
Function Main() As Long Dim AVL As AVLTree = Tree_New() Tree_Set(AVL, "Key1", "Value1") Tree_Set(AVL, "Key2", "Value2") Tree_Set(AVL, "Key3", "Value3") Dim pNode As Long = Tree_Last(AVL) Do Until pNode = 0 TracePrint Tree_GetData(pNode) pNode = Tree_Prev(pNode) Loop End Function
当然,这里前后的概念并不意味着后添加的数据一定在后面,对于哈希表和AVL树来说,顺序是一个虚无的属性,并不可靠。
关于AVL树的操作函数,在【命令大全 - 标准库 - AVL树操作】分类下。