环境要求
Windows XP
及以上。Windows 10
、Windows 11
在Windows 功能
中勾选.NET Framework 3.5 (包括 .NET 2.0 和 3.0)
。
优点
- 相比
VBScript
内置的数组,大小可自动变化。 - 原生支持尾部添加、插入、删除、修改、切片、范围删除、翻转、查询、克隆等操作,免去了手动编写相关逻辑。
- 可方便的转换为
VBScript
内置的数组。
使用
创建一个 ArrayList
对象:
Set oArr = CreateObject("System.Collections.ArrayList")
Add 方法:在动态数组末尾添加元素
均摊时间复杂度 O(1)
。
Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Add Empty
oArr.Add Null
oArr.Add "String"
oArr.Add 0
oArr.Add 3.14
oArr.Add CreateObject("Scripting.FileSystemObject")
Count 属性:表示动态数组当前元素个数
时间复杂度 O(1)
。
Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Count
vbLong, Value: 0
oArr.Add(8)
vbLong, Value: 0
oArr.Count
vbLong, Value: 1
Item 属性:表示动态数组的各元素
接收一个整数作为索引,下标从 0
开始。
时间复杂度 O(1)
。
Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Add Empty
oArr.Add Null
oArr.Add "String"
oArr.Add 0
oArr.Add 3.14
oArr.Add CreateObject("Scripting.FileSystemObject")
oArr.Item(4)
vbDouble, Value: 3.14
Execute("oArr.Item(4) = 3.1415926")
vbEmpty (uninitialized variable)
oArr.Item(4)
vbDouble, Value: 3.1415926
Execute("Set oArr.Item(4) = CreateObject(""Scripting.FileSystemObject"")")
vbEmpty (uninitialized variable)
TypeName(oArr.Item(4))
vbString, Value: FileSystemObject
Capacity 属性:表示动态数组目前的容量
若容量不足,会自动扩容并拷贝原来的元素。
扩容的时间复杂度是O(n)
。
Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Capacity
vbLong, Value: 0
oArr.Count
vbLong, Value: 0
oArr.Count <= oArr.Capacity
vbBoolean, Value: True
For i = 1 To 100
oArr.Add i
Next
oArr.Count
vbLong, Value: 100
oArr.Capacity
vbLong, Value: 128
Clear 方法:清空动态数组
Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Add(6)
vbLong, Value: 0
oArr.Count
vbLong, Value: 1
oArr.Clear
vbEmpty (uninitialized variable)
oArr.Count
vbLong, Value: 0
Clone 方法:返回该动态数组的深拷贝
时间复杂度O(n)
。
Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Add 666
Set oArr2 = oArr.Clone
oArr2.Add 888
oArr2.Count
vbLong, Value: 2
oArr.Count
vbLong, Value: 1
相对的,浅拷贝只是复制一份引用。
浅拷贝的时间复杂度是 O(1)
。
下面是一个浅拷贝的例子:
Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Add 666
Set oArr2 = oArr
oArr2.Add 888
oArr2.Count
vbLong, Value: 2
oArr.Count
vbLong, Value: 2
ToArray 方法:将动态数组转为普通 VBScript 数组
时间复杂度 O(n)
。
Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Add 1
oArr.Add 3.1415926
oArr.Add True
oArr.ToArray()
vbArray Len: 3
0): vbInteger, Value: 1
1): vbDouble, Value: 3.1415926
2): vbBoolean, Value: True
Contains 方法:检查动态数组内是否包含特定元素
时间复杂度O(n)
。
Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Add 2333
oArr.Contains(2333)
vbBoolean, Value: True
oArr.Contains(233)
vbBoolean, Value: False
GetRange 方法:返回数组的一个切片
参数:起始下标、切片长度。
时间复杂度 O(n)
。
Set oArr = CreateObject("System.Collections.ArrayList")
For i = 0 To 9
oArr.Add i
Next
oArr.ToArray()
vbArray Len: 10
0): vbInteger, Value: 0
1): vbInteger, Value: 1
2): vbInteger, Value: 2
3): vbInteger, Value: 3
4): vbInteger, Value: 4
5): vbInteger, Value: 5
6): vbInteger, Value: 6
7): vbInteger, Value: 7
8): vbInteger, Value: 8
9): vbInteger, Value: 9
Set oArr2 = oArr.GetRange(2, 5)
oArr2.ToArray()
vbArray Len: 5
0): vbInteger, Value: 2
1): vbInteger, Value: 3
2): vbInteger, Value: 4
3): vbInteger, Value: 5
4): vbInteger, Value: 6
Insert 方法:插入元素
时间复杂度O(n)
。
参数:下标、元素。
Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Add 0
oArr.Add 5
oArr.ToArray()
vbArray Len: 2
0): vbInteger, Value: 0
1): vbInteger, Value: 5
oArr.Insert(1, 4)
vbEmpty (uninitialized variable)
oArr.ToArray()
vbArray Len: 3
0): vbInteger, Value: 0
1): vbInteger, Value: 4
2): vbInteger, Value: 5
oArr.Insert(3, 6)
vbEmpty (uninitialized variable)
oArr.Insert(1, 2)
vbEmpty (uninitialized variable)
oArr.Insert(2, 3)
vbEmpty (uninitialized variable)
oArr.ToArray()
vbArray Len: 6
0): vbInteger, Value: 0
1): vbInteger, Value: 2
2): vbInteger, Value: 3
3): vbInteger, Value: 4
4): vbInteger, Value: 5
5): vbInteger, Value: 6
Remove 方法:移除指定的元素
时间复杂度 O(n)
。
注意:
- 只会移除从头至尾第一个遇到的和指定元素相等的元素。
- 如果没有找到指定的元素,那么什么也不会发生。
Set oArr = CreateObject("System.Collections.ArrayList")
For i = 1 To 5
oArr.Add i Mod 2
Next
oArr.ToArray()
vbArray Len: 5
0): vbInteger, Value: 1
1): vbInteger, Value: 0
2): vbInteger, Value: 1
3): vbInteger, Value: 0
4): vbInteger, Value: 1
oArr.Remove(1)
vbEmpty (uninitialized variable)
oArr.ToArray()
vbArray Len: 4
0): vbInteger, Value: 0
1): vbInteger, Value: 1
2): vbInteger, Value: 0
3): vbInteger, Value: 1
oArr.Remove(2)
vbEmpty (uninitialized variable)
oArr.ToArray()
vbArray Len: 4
0): vbInteger, Value: 0
1): vbInteger, Value: 1
2): vbInteger, Value: 0
3): vbInteger, Value: 1
RemoveAt 方法:移除指定位置的元素
时间复杂度 O(n)
。
Set oArr = CreateObject("System.Collections.ArrayList")
For i = 1 To 5
oArr.Add i Mod 2
Next
oArr.ToArray()
vbArray Len: 5
0): vbInteger, Value: 1
1): vbInteger, Value: 0
2): vbInteger, Value: 1
3): vbInteger, Value: 0
4): vbInteger, Value: 1
oArr.RemoveAt(0)
vbEmpty (uninitialized variable)
oArr.RemoveAt(1)
vbEmpty (uninitialized variable)
oArr.RemoveAt(2)
vbEmpty (uninitialized variable)
oArr.ToArray()
vbArray Len: 2
0): vbInteger, Value: 0
1): vbInteger, Value: 0
RemoveRange 方法:移除指定区间的元素
参数:起始下标、长度。
时间复杂度 O(n)
。
Set oArr = CreateObject("System.Collections.ArrayList")
For i = 0 To 5
oArr.Add i
Next
oArr.ToArray()
vbArray Len: 6
0): vbInteger, Value: 0
1): vbInteger, Value: 1
2): vbInteger, Value: 2
3): vbInteger, Value: 3
4): vbInteger, Value: 4
5): vbInteger, Value: 5
oArr.RemoveRange(3, 2)
vbEmpty (uninitialized variable)
oArr.ToArray()
vbArray Len: 4
0): vbInteger, Value: 0
1): vbInteger, Value: 1
2): vbInteger, Value: 2
3): vbInteger, Value: 5
Reverse 方法:翻转数组
时间复杂度 O(n)
。
oArr.Clear()
For i = 0 To 9
oArr.Add i
Next
vbEmpty (uninitialized variable)
oArr.ToArray()
vbArray Len: 10
0): vbInteger, Value: 0
1): vbInteger, Value: 1
2): vbInteger, Value: 2
3): vbInteger, Value: 3
4): vbInteger, Value: 4
5): vbInteger, Value: 5
6): vbInteger, Value: 6
7): vbInteger, Value: 7
8): vbInteger, Value: 8
9): vbInteger, Value: 9
oArr.Reverse()
vbEmpty (uninitialized variable)
oArr.ToArray()
vbArray Len: 10
0): vbInteger, Value: 9
1): vbInteger, Value: 8
2): vbInteger, Value: 7
3): vbInteger, Value: 6
4): vbInteger, Value: 5
5): vbInteger, Value: 4
6): vbInteger, Value: 3
7): vbInteger, Value: 2
8): vbInteger, Value: 1
9): vbInteger, Value: 0
Sort 方法:将数组内元素排序
时间复杂度 O(n * log(n))
。
Set oArr = CreateObject("System.Collections.ArrayList")
For i = 0 To 9
oArr.Add Fix(Rnd() * 100)
Next
oArr.ToArray()
vbArray Len: 10
0): vbSingle, Value: 70
1): vbSingle, Value: 53
2): vbSingle, Value: 57
3): vbSingle, Value: 28
4): vbSingle, Value: 30
5): vbSingle, Value: 77
6): vbSingle, Value: 1
7): vbSingle, Value: 76
8): vbSingle, Value: 81
9): vbSingle, Value: 70
oArr.Sort()
vbEmpty (uninitialized variable)
oArr.ToArray()
vbArray Len: 10
0): vbSingle, Value: 1
1): vbSingle, Value: 28
2): vbSingle, Value: 30
3): vbSingle, Value: 53
4): vbSingle, Value: 57
5): vbSingle, Value: 70
6): vbSingle, Value: 70
7): vbSingle, Value: 76
8): vbSingle, Value: 77
9): vbSingle, Value: 81
TrimToSize 方法:使容量缩减为正好与当前元素个数相等
Set oArr = CreateObject("System.Collections.ArrayList")
For i = 0 To 9
oArr.Add Fix(Rnd() * 100)
Next
oArr.Capacity
vbLong, Value: 16
oArr.Count
vbLong, Value: 10
oArr.TrimToSize()
vbEmpty (uninitialized variable)
oArr.Capacity
vbLong, Value: 10