使用具有属性的对象隐藏字符串VS中的变量?

时间:2015-09-08 00:43:37

标签: arrays excel-vba optimization collections vba

所以,我在Excel中得到了一个分析程序的单词,我希望能够导入超过3000万个单词。

首先,我为每个单词创建了一个单独的对象,以便每个单词都有一个......

.value '(string), the actual word itself
.bool1 '(boolean) 
.bool2 '(boolean)
.bool3 '(boolean)
.isUsed '(boolean)
.cancel '(boolean)

当我发现我可能有3000万个这些对象(都存储在一个集合中)时,我认为这可能是一个可以编译的怪物。所以我决定我的所有单词都是字符串,并且我会把它们粘在一个数组中。

所以我的数组想法是在每个字符串的开头添加5个空格(对于我的5个bool)来附加3000万个字符串中的每个字符串,每个空格代表一个假bool val。 e.g,

If instr(3, arr(n), " ") = 1 then   
'my 3rd bool val is false. 
Elseif instr(3, arr(n), "*") = 1 then '(I'll insert a '*' to denote true) 
'my third bool val is true.
End If

无论如何,你们怎么想?我应该采用哪种方式(集合或数组)(具体为优化)?

1 个答案:

答案 0 :(得分:2)

(我想把它作为评论,但它变得太长了)

答案取决于您在存储后如何访问和处理单词。

3名候选人有显着的好处和明显的优势:

  1. 数组非常有效地一次填充和检索所有项目(例如,数组范围和数组返回范围),但重新调整大小和插入项目的速度要慢得多中间。每个Redim都将整个内存块复制到一个更大的位置,如果使用Preserve,则所有值都会被复制。这可能转化为每个操作(在潜在的应用程序中)的感知缓慢

    • 更多详细信息(数组与集合)here(VB特定但它也适用于VBA)
  2. 集合是带有哈希表的链接列表 - 填充速度非常慢但在此之后您可以即时访问集合中的任何元素,并且在重新排序(排序)时也一样快大小调整。这可以转换为慢速打开文件,但所有其他操作都是即时的。其他方面:

    • 检索密钥以及与这些密钥关联的项目
    • 处理区分大小写的密钥
    • 项目可以是其他集合,数组,对象
    • 虽然键必须是唯一的,但它们也是可选的
    • 可以参考其键或参考其索引值
    • 返回一个项目
    • 键始终是字符串,并且始终不区分大小写
    • 项目是可访问和可检索的,但其键不是
    • 无法一次删除所有项目(逐个删除,或者销毁然后重新创建集合
    • 枚举For ... Each ... Next,列出所有项目

    • 更多信息herehere

  3. 字典:与集合相同,但具有.Exists()方法的额外好处,在某些情况下,它们比集合更快。其他方面:

    • 键是必需的,并且始终是该词典的唯一
    • 只能参考其键
    • 返回一个项目
    • 密钥可以采用任何数据类型;对于字符串键,默认情况下,Dictionary是区分大小写的
    • Exists()方法测试是否存在特定键(和项目)

      • 收藏品没有类似的测试;相反,您必须尝试从Collection中检索值,并在未找到密钥时处理生成的错误
    • 项目和密钥始终可供开发人员访问和检索
    • 项目属性是读/写,因此它允许更改与特定键相关联的项目
    • 允许您在不破坏字典本身的情况下一步删除所有项目
    • 使用For ... Each ...下一个词典将枚举键
    • 字典支持使用Item属性隐式添加项目。

      • 在收藏集中,必须明确添加项目
    • 更多详情here

  4. 其他链接:optimizing loopsoptimizing strings(同一网站)