VBA编程技巧 之 字典对象使用经验谈(5)

2025-06-22

人他哥哥弟弟叫什么,他爸叫什么,此人肯定是知道的一样(当然如果问他八辈子祖宗叫啥他很可能不知道)。话说一个很有趣的现象,所有中文描述中都把原本英文中的中性描述变成了男性描述,Parent->父,Child->子,Sibling->兄弟,你不会看到有叫母节点、母对象、女节点、姊妹节点等等称呼的。作为对比,可以看看这篇文章,在Visual Basic编程中运用数据结构,此文中是采用自定义数据类型和数组来模拟单向链表和栈及队列的,可以设想一下如果采用字典对象来实现会是什么样的一个情况。

让我们来尝试构造更为复杂的结构吧。设想在一所高中里的所有学生,这些学生之间会存在这样或那样的关系,同学的、邻居的、亲兄弟姐妹的、表亲的、朋友的、恋人的(嗯,这个在高中不提倡哈)等等等等,要描述清楚这些关系显然很复杂,让我们将关系仅仅定义为互相是否认识。那么显然 A 是否认识 B 是个已知条件,否则我们的数学模型也就无从建起。那么我们可以建立这样的一个数据表,每个学生的姓名(假设姓名都是唯一的)是首列,而其认识的所有人的姓名用逗号隔开放在第二列。为了分析这样的一个数据,我们可以利用字典对象建立一个网状结构。每个人是一个节点并用姓名索引,其元素值也是一个字典对象,该字典由其认识的人姓名进行索引,然后链接至对应的节点。让我们尝试着写一下示意代码,如下: 复制内容到剪贴板 代码:

Function 创建关系网()

Dim dic关系网, arr源数据, arr认识的人, str姓名, dic某人节点 Dim i&, j&

arr源数据 = Sheet1.[a1].CurrentRegion

Set dic关系网 = CreateObject(\ For i = 1 To Ubound(arr源数据) str姓名 = arr源数据(i, 1)

Set dic关系网(str姓名) = CreateObject(\ Next

For i = 1 to Ubound(arr源数据) str姓名 = arr源数据(i, 1)

arr认识的人 = Split(arr源数据(i, 2), \ Set dic某人节点 = dic关系网(str姓名) For j = 0 To Ubound(arr认识的人) str姓名 = arr认识的人(j)

Set dic某人节点(str姓名) = dic关系网(str姓名) Next Next

Set 创建关系网 = dic关系网 End Function

现在,我们只需要调用这个函数就能获得一个由字典对象创建的网状结构啦。不知道大家听过这么一种说法吗,如果任何一个人想找世界上任何一个另外的人,需要经过互相认识的人的介绍不会超过6个!嗯,显然这一说法是不可能被证明的。但如果真的作为一个证明题的话,那请给我世界上每个人所认识的人的清单,至少我们能够建立一个超级网状数据模型,至于如何能够找出任何两个节点间的最短路径的问题则是算法范畴啦,不在此文讨论之列。

整个第四节的内容是我在开始这篇文章的时候才想到的,而由于我本人不是什么专业人士,所以也想不到有什么应用,权当有趣罢。

添加了个附件,期盼有人写个找出任意两点的全部不重复路径的代码。

21

结语

行文至此,也是结束的时候了。非常汗颜的是我是在最近一两个月才开始尝试使用字典对象的,十分感谢EH的众多朋友,我是在EH里才认识到这个工具的,之前虽有听说,但一直都没用过。而居然我会写这么一个长篇来介绍如何使用,现在想想都有些可笑,相信文中会有很多错漏之处,欢迎各位朋友指出。同样的也欢迎大家能共同讨论各自的发现或经验。

如果你现在问我什么是字典,那我会告诉你:字典是这样的一个工具,它具有 Add Remove RemoveAll 等等方法,由关键字和值组成,关键字是唯一的,值可以是任何一种数据类型 ........

是的,字典对象仅仅是一个工具,如果觉得顺手的话,不妨多用用。感谢阅读。 <全文完>

22


VBA编程技巧 之 字典对象使用经验谈(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:高二(理科)数学第一学期期中试卷

相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219