简单哈希表Excel VBA

时间:2013-06-16 22:34:45

标签: arrays excel-vba hashtable vba excel

我是VBA中数组的长用户,但我最近学到了一些关于哈希的知识,我想知道我是否可以使用它来在我的数组中构建更高效的搜索。为了保持它的具体性,我所做的是将一个二维数组变成一个行字典,其中键是一个字符串(当然是唯一的),在'单元格'中找到并通过asc转换为双精度。

我想下面的代码解释了我的意思:

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

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

但是我不能忘记应该有一个比我自己构建哈希更容易和更合理的路径的想法。我是一条好路吗?是否有更简单的方法来“散列数组”,所以每次我需要时都不必循环播放?

1 个答案:

答案 0 :(得分:0)

字典允许将字符串(或除数组之外的任何数据类型)用作键值(以及作为项值)。因此,如您所知,您不需要自己进行任何散列,只需在密钥和值中存储“SomeStringOneWantstoFind”即可。

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

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

我对集合/词典和数组很新,所以我创建了一个有用的婴儿床单,我已经分享了here

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

这是我对你的问题的理解以及你在做什么。

在你的代码中,你将“SomeStringOneWantstoFind”转换为一个唯一的数字(使用Asc)并将其存储为hey键,将“TEST”存储为文本。我怀疑你实际上会将“SomeStringOneWantstoFind”存储为值。

那么你为什么这样做就是问题!

你提到哈希。因此,您需要查找文本值以查看它是否在字典中。即找出“MyTextToFind”是否存在。

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

这一点都没有必要 - 我想。

请注意,词典总是需要一个键和一个Item(即一个值)