之前的一些文章,我们详细解了集合、数组和字典这三种常用的数据结构。在本文中,我们简单小结一下,看看它们之间有哪些区别,以巩固所学的知识。
存储的类型
数组
数组是一组具有相同名称的同类元素。可用来存储多个相同类型的变量。
集合
集合可以用来存储不同的数据类型。
字典
字典可以用来存储不同的数据类型。
注意,在数组中,可以存储用户定义类型。然而,不能在字典或集合中存储用户定义类型。
变量声明
数组
在声明数组变量时,可以指定数组的大小,如:
Dim MyArray(5) As Integer
也可以先不指定数组的大小:
Dim MyArray() As Integer
在使用之前,须指定其大小:
ReDim MyArray(5)
集合
可以先声明集合变量:
Dim col As Collection
在需要使用该集合前创建集合对象:
Set col = New Collection
也可以在声明的同时创建集合对象:
Dim col As New Collection
字典
创建字典对象,先要设置对库文件Microsoft Scripting Runtime的引用。可以编写声明字典对象变量的代码如下:
Dim dict As New Dictionary
或者:
Dim dict As Dictionary
Set dict = New Dictionary
对元素赋值
1.不能对集合中已有元素重新赋值。
2.可以修改字典元素的值。在给指定键的字典元素赋值时,如果指定键的字典元素已存在,则会修改该元素的值。如果指定键的字典元素不存在,则会添加新字典元素。
3.集合、字典都是对象,在返回整个对象时,应使用Set语句。
对元素的访问
数组、集合、字典的存储结构不同,决定了访问其元素的差异。
数组
每个元素放置在固定的位置,我们需要知道其索引,来访问它。例如:
Dim MyArray(5) As Integer
Dim i As Integer
For i = 0 To 5
MyArray(i) = i
Nexti
‘访问第2个元素
Debug.Print MyArray(1)
数组的索引值默认从0开始。
集合
下面的代码先声明集合对象,然后在添加元素项时定义键值:
Dim col As Collection
Dim rng As Excel.Range
Dim sRangeName As String
Set col = New Collection
sRangeName= “RangeName”
Set rng = Range(sRangeName)
col.Add rng, sRangeName
此时,想从该集合中获取特定元素项时,可以指定其位置(索引值),或者使用键值。如果你知道其是第一个添加到集合中的且位置没有变化,可以使用索引值:
col.Item(1)
集合的索引值基于1。也可以使用键值:
col.Item(sRangeName)
集合的索引值从1开始。
字典
字典中有唯一标识元素的键,我们只需要使用这个键来访问元素,而不需知道其具体的存放位置。
下面的代码添加对象到字典中,其语法与添加元素项到集合中非常相似,只是键和元素参数的位置相反:
Dim dict As Scripting.Dictionary
Dim rng As Excel.Range
Dim sRangeName As String
Set dict = New Scripting.Dictionary
sRangeName= “RangeName”
Set rng = Range(sRangeName)
dict.Add sRangeName, rng
可以使用下面的语句来获取指定键所在的元素项:
dict.Item(sRangeName)
添加元素
添加元素时,集合与字典的参数位置刚好相反,例如:
‘在集合中添加元素
col.Add Item:=6, Key:=”东区”
‘在字典中添加元素
dict.Add Key:=”东区”,Item:=6
然而,对于集合,没有内置的方法来检查是否已存在指定的键,但是可以使用Exists方法检查字典中是否存在指字键。
什么时候使用
在编程时,通常要求我们能创建一个对象,能够存放一组相关的值,并且能够通过该对象便捷地处理存储的值,数组、集合、字典都能实现这个目的。
数组
当有许多同类型的数据需要逐一处理时,可以使用数组。然而,数组的大小在使用之前通常是固定的,因此在知道数据数量的前提下使用数组。
集合
集合可任意添加或删除元素,因此对于数量变化的数据使用集合更好。相对于数组,集合更容易使用一些,特别是添加元素、遍历元素。然而,集合是只读的,你可以添加或删除集合中的元素,但不能修改其值。
字典
有一系列数据,但是需要获取不重复元素值时,可以使用字典。
字典与集合
集合是一种很好的数据结构,在Excel对象模型中几乎所有的容器结构都是使用集合,例如:Workbooks、Worksheets等。
然而,字典有更多的内置方法,使得其使用比集合更方便。特别是下列3个方法:
1.Exists方法:用来判断字典中是否存在指定的键。(如果要在集合中检查指定的键是否存在,则需要额外编写一段代码来完成)
2.Keys方法:返回一个数组,包含字典中所有的键。(同样,集合中实现相同的目的需要编写遍历和填充的代码)
3.RemoveAll方法:清除字典中所有的元素。
此外,正如前面提到的,字典允许我们修改键和值。并且,由于Dictionary对象使用了散列表和一些先进的排序和索引算法,因此字典的运行速度也快于集合的速度。
数组与集合
与使用数组相比,使用集合对象更便于访问和维护:
1.集合成员可以添加在一个已经存在成员的前面或后面,这取决于该已有成员的键值或索引值。
2.集合成员可以通过它们的键值或索引值访问。
3.集合成员可以通过它们的键值或索引值删除。但是,利用一个索引值删除多个成员时,应该从后面开始删除,即从索引值较高的成员到索引值较低的成员,因为每次删除成员后集合就要重新建立索引。
数组与字典、集合
正如前面提到的,在数组中,可以存储用户定义类型。然而,不能在字典或集合中存储用户定义类型。
……