arrays - 简单的哈希表 Excel VBA

标签 arrays excel hashtable vba

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

相关文章:

php - SQL 结果作为 PHP 数组

ios - 使用枚举迭代CGPoint数组以创建多个 Sprite

excel - 将 IF(使用 ISTEXT、FIND、MID 将日期转换为正确的格式)语句转换为自定义 VBA 函数

javascript - 使用 js-xlsx 解析 Excel 中的数据

c++ - 用数组和 C++ 字符串实现哈希算法 - 段错误(核心转储)

Java 相当于 Kotlin 中的 arrayof()/listof()/setof()/mapof()

vba - Excel - 检查指定月份的任何一天是否在日期范围内

c++ - 用于开放寻址哈希表的高效 C++ API

c - 如何制作灵活大小的哈希表

javascript - 连接没有索引 0 的 JSON 数组对象未定义