2

我是 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

它看起来很有效,当我只想在数据中找到一些东西时,它完成了避免循环的工作。

但是我无法摆脱这样的想法,即应该有比自己构建散列更容易和更合乎逻辑的路径。我走在一条好路上吗?有没有更简单的方法来“散列一个数组”,所以每次我需要一些东西时都不必循环?

4

1 回答 1

0

字典允许将字符串(或除数组之外的任何数据类型)用作键值(和项值)。因此,正如您所怀疑的那样,您无需自己进行任何散列,只需将“SomeStringOneWantstoFind”存储在键和值中即可。

字典对象上有一个存在方法,可以让您找出是否存在可用于执行此操作的键值。

集合可以只使用一个键值来设置,因此您可以使用集合而不是字典,但集合没有 exists 方法。

我对集合/字典和数组很陌生,所以我创建了一个有用的婴儿床单,我在这里分享了

我欢迎您的意见,因为我仍然觉得我没有引用得到它,而且我确信自从您写了这个问题以来您已经继续前进。


这是我对您的问题和您在做什么的理解。

在您的代码中,您将“SomeStringOneWantstoFind”转换为唯一编号(使用 Asc)并将其存储为嘿键和“TEST”作为文本。我怀疑实际上您会将“SomeStringOneWantstoFind”存储为值。

所以你为什么要这样做是个问题!

你提到散列。因此,您想查找一个文本值以查看它是否在字典中。即找出“MyTextToFind”是否存在。

所以我假设你正在以类似的方式使用 Asc 转换“MyTextToFind”,然后使用字典来查看它是否存在。

这有点不必要 - 我认为。

请注意,字典总是需要一个键和一个项目(即一个值)

于 2015-09-09T16:25:18.700 回答