我是 VBA 中数组的长期用户,但我最近了解了一些关于散列的知识,我想知道是否可以使用它在我的数组中构建更有效的搜索。为了保持具体,我所做的是将二维数组转换为行字典,其中键是在“单元格”中找到的字符串(当然是唯一的),并通过 asc 转换为 double。
我想下面的代码解释了我的意思:
Private pHook As Object
Sub test()
Set pHook = CreateObject("Scripting.Dictionary")
key = StoAsc("SomeStringOneWantstoFind")
If Not pHook.Exists(key) Then pHook.Add key, "TEST"
d = pHook(key)
End Sub
Public Function StoAsc(stg As String) As Double:
Dim key As String
key = ""
For ii = 1 To Len(stg)
S = Asc(Mid(stg, ii, 1))
key = key & S
Next ii
StoAsc = CDbl(key)
End Function
它看起来很有效,当我只想在数据中找到一些东西时,它完成了避免循环的工作。
但是我无法摆脱这样的想法,即应该有比自己构建散列更容易和更合乎逻辑的路径。我走在一条好路上吗?有没有更简单的方法来“散列一个数组”,所以每次我需要一些东西时都不必循环?
最佳答案
字典允许将字符串(或除数组之外的任何数据类型)用作键值(和项值)。因此,正如您所怀疑的那样,您无需自己进行任何散列,只需将“SomeStringOneWantstoFind”存储在键和值中即可。
字典对象上有一个存在方法,可以让您找出是否存在可用于执行此操作的键值。
集合可以只使用一个键值来设置,因此您可以使用集合而不是字典,但集合没有 exists 方法。
我对集合/字典和数组很陌生,所以我创建了一个有用的婴儿床单,我已经分享了 here
我欢迎您的意见,因为我仍然觉得我没有引用得到它,而且我确信自从您写了这个问题以来您已经继续前进。
这是我对您的问题和您在做什么的理解。
在您的代码中,您将“SomeStringOneWantstoFind”转换为唯一编号(使用 Asc)并将其存储为嘿键和“TEST”作为文本。我怀疑实际上您会将“SomeStringOneWantstoFind”存储为值。
所以你为什么要这样做是个问题!
你提到散列。因此,您想查找一个文本值以查看它是否在字典中。即找出“MyTextToFind”是否存在。
所以我假设你正在以类似的方式使用 Asc 转换“MyTextToFind”,然后使用字典来查看它是否存在。
这有点不必要 - 我认为。
请注意,字典总是需要一个键和一个项目(即一个值)
关于arrays - 简单的哈希表 Excel VBA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17138363/