|
本帖最后由 lee1892 于 2014-12-10 14:30 编辑
本贴附件:
不用字典、集合实现联动菜单 及 简易字典功能的实现 by Lee1892.rar
(18.43 KB, 下载次数: 375)
修订附件:
不用字典、集合实现联动菜单 及 简易字典功能的实现 v1.0 by Lee1892.rar
(23.17 KB, 下载次数: 629)
坛子里介绍如何实现联动菜单的贴子不少了,我自己就写过蛮多的,现在回头看以前的那个字典套字典的贴子都犯晕
本贴附件效果:
这里介绍一个使用简易字典功能实现的办法,采用的是除余法,字典功能的实现只是简单的一个函数,如下:- Private lngCount As Long ' 字典项目计数
- Private arrKeys() As String ' 字典的关键字数组, 树结构中节点的由根节点开始的全路径
- Private arrItems() As String ' 字典的项目数组, 树结构中该节点下的子节点名以逗号连接
- Private lngCollision As Long ' 哈希表位置碰撞计数
- Private lngTableSize As Long ' 哈希表大小
- Private arrHashTable() As Long ' 哈希表数组, 下标为关键字计算所得的值, 值为该关键字对应的序号
- Private Function GetIndex&(sPath$, Optional IsNewItem As Boolean = False)
- Rem IsNewItem = True, 返回新项目在哈希表中的位置
- Rem IsNewItem = False, 返回字符串对应的序号
- Dim i&, aStr() As Byte, nStrKey&, nHashInd&
- Const LNG_SEED_1& = 113
- Const LNG_SEED_2& = 601
- Const LNG_SEED_3& = 71
- Const LNG_SEED_4& = 137
- Const LNG_MODE& = 470011
- Const LNG_PRIME& = 3571
- Rem 计算字符串特征值
- aStr = sPath
- For i = 0 To 2 * Len(sPath) - 1 Step 2
- nStrKey = (nStrKey * LNG_SEED_1 + CLng(aStr(i)) * LNG_SEED_2) Mod LNG_MODE
- nStrKey = (nStrKey * LNG_SEED_3 + CLng(aStr(i + 1)) * LNG_SEED_4) Mod LNG_MODE
- Next
- Rem 由特征值计算哈希表中位置
- nHashInd = nStrKey * LNG_PRIME Mod lngTableSize + 1 ' 哈希表数组下标由 1 开始
- Rem 处理哈希表位置碰撞
- Do
- Rem 如果该位置未被占用,则如为查询新项目在哈希表中的位置则返回该位置否则返回零
- If arrHashTable(nHashInd) = 0 Then GetIndex = IIf(IsNewItem, nHashInd, 0): Exit Do
- If IsNewItem Then
- Rem 对哈希表位置碰撞计数
- lngCollision = lngCollision + 1
- Debug.Print Format(lngCollision, "000: ");
- Debug.Print sPath
- Debug.Print String(5, " "); arrKeys(arrHashTable(nHashInd))
- Else
- Rem 对比该位置对应的关键字是否与输入字符串相同,相同则返回哈希表中该位置的值
- If Len(sPath) = Len(arrKeys(arrHashTable(nHashInd))) Then
- If sPath = arrKeys(arrHashTable(nHashInd)) Then GetIndex = arrHashTable(nHashInd): Exit Do
- End If
- End If
- Rem 产生哈希表位置碰撞,位置向后挪一位查询
- nHashInd = nHashInd + 1
- If nHashInd > lngTableSize Then nHashInd = 1
- Loop
- End Function
复制代码 |
评分
-
1
查看全部评分
-
|