【原创】在 VBScript 中使用动态数组(ArrayList)

环境要求

  • Windows XP 及以上。
  • Windows 10Windows 11Windows 功能 中勾选 .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")
oArr.Add New RegExp

Count 属性:表示动态数组当前元素个数

时间复杂度 O(1)

Set oArr = CreateObject("System.Collections.ArrayList")
WSH.Echo oArr.Count()
0
oArr.Add 8
WSH.Echo oArr.Count()
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")
WSH.Echo oArr.Item(4)
3.14
oArr.Item(4) = 3.1415926
WSH.Echo oArr.Item(4)
3.1415926
Set oArr.Item(4) = CreateObject("Scripting.FileSystemObject")
WSH.Echo TypeName(oArr.Item(4))
FileSystemObject

Default 默认属性:表示动态数组的各元素

Item 属性。

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")
WSH.Echo oArr(4)
3.14
oArr(4) = 3.1415926
WSH.Echo oArr(4)
3.1415926
Set oArr(4) = CreateObject("Scripting.FileSystemObject")
WSH.Echo TypeName(oArr(4))
FileSystemObject

Capacity 属性:表示动态数组目前的容量

若容量不足,会自动扩容并拷贝原来的元素。

扩容的时间复杂度是O(n)

Set oArr = CreateObject("System.Collections.ArrayList")
WSH.Echo oArr.Count, oArr.Capacity
0 0
For i = 1 To 100
    oArr.Add i
Next
WSH.Echo oArr.Count, oArr.Capacity
100 128
oArr.Capacity = oArr.Count
WSH.Echo oArr.Count, oArr.Capacity
100 100

IsFixedSize 属性:数组是否为固定大小

会返回 False

Set oArr = CreateObject("System.Collections.ArrayList")
WSH.Echo oArr.IsFixedSize()
0

IsReadOnly 属性:数组是否为只读

会返回 False

Set oArr = CreateObject("System.Collections.ArrayList")
WSH.Echo oArr.IsReadOnly()
0

IsSynchronized 属性:表示是否同步对数组的访问

由于 VBScript 是单线程的,此属性无意义。

会返回 False

Set oArr = CreateObject("System.Collections.ArrayList")
WSH.Echo oArr.IsSynchronized()
0

Clear 方法:清空动态数组

Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Add 6
WSH.Echo oArr.Count()
1
oArr.Clear
WSH.Echo oArr.Count()
0

Clone 方法:返回该动态数组的拷贝

时间复杂度O(n)

Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Add 666
Set oArr2 = oArr.Clone
oArr2.Add 888
WSH.Echo oArr Is oArr2, oArr.Count(), oArr2.Count()
0 1 2
Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Add 666
Set oArr2 = oArr
oArr2.Add 888
WSH.Echo oArr Is oArr2, oArr.Count(), oArr2.Count()
-1 2 2
Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Add New RegExp
oArr.Add CreateObject("Scripting.FileSystemObject")
Set oArr2 = oArr.Clone
WSH.Echo oArr Is oArr2, oArr(0) Is oArr2(0), oArr(1) Is oArr2(1)
0 -1 -1

ToArray 方法:将动态数组转为普通 VBScript 数组

时间复杂度 O(n)

Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Add 1
oArr.Add 3.1415926
oArr.Add True
WSH.Echo Join(oArr.ToArray(), " ")
1 3.1415926 True

Contains 方法:检查动态数组内是否包含特定元素

时间复杂度O(n)

Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Add 2333
oArr.Add Null
oArr.Add oArr
WSH.Echo oArr.Contains(2333), oArr.Contains(233), oArr.Contains(Null)
-1 0 -1
WSH.Echo oArr.Contains(oArr), oArr.Contains(CreateObject("System.Collections.ArrayList"))
-1 0

GetRange 方法:返回数组的一个切片

参数:起始下标、切片长度。

时间复杂度 O(n)

Set oArr = CreateObject("System.Collections.ArrayList")
For i = 0 To 9
    oArr.Add i
Next
WSH.Echo Join(oArr.ToArray(), " ")
0 1 2 3 4 5 6 7 8 9
Set oArr2 = oArr.GetRange(2, 5)
WSH.Echo Join(oArr2.ToArray(), " ")
2 3 4 5 6

Insert 方法:插入元素

时间复杂度O(n)

参数:下标、元素。

Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Add 0
oArr.Add 5
WSH.Echo Join(oArr.ToArray(), " ")
0 5
oArr.Insert 1, 4
WSH.Echo Join(oArr.ToArray(), " ")
0 4 5
oArr.Insert 3, 6
oArr.Insert 1, 2
oArr.Insert 2, 3
WSH.Echo Join(oArr.ToArray(), " ")
0 2 3 4 5 6

Remove 方法:移除指定的元素

时间复杂度 O(n)

注意:

  • 只会移除从头至尾第一个遇到的和指定元素相等的元素。
  • 如果没有找到指定的元素,那么什么也不会发生。
Set oArr = CreateObject("System.Collections.ArrayList")
For i = 1 To 5
    oArr.Add i Mod 2
Next
WSH.Echo Join(oArr.ToArray(), " ")
1 0 1 0 1
oArr.Remove 1
WSH.Echo Join(oArr.ToArray(), " ")
0 1 0 1
oArr.Remove 2
WSH.Echo Join(oArr.ToArray(), " ")
0 1 0 1

RemoveAt 方法:移除指定位置的元素

时间复杂度 O(n)

Set oArr = CreateObject("System.Collections.ArrayList")
For i = 1 To 5
    oArr.Add i Mod 2
Next
WSH.Echo Join(oArr.ToArray(), " ")
1 0 1 0 1
oArr.RemoveAt 0
oArr.RemoveAt 1
oArr.RemoveAt 2
WSH.Echo Join(oArr.ToArray(), " ")
0 0

RemoveRange 方法:移除指定区间的元素

参数:起始下标、长度。

时间复杂度 O(n)

Set oArr = CreateObject("System.Collections.ArrayList")
For i = 0 To 5
    oArr.Add i
Next
WSH.Echo Join(oArr.ToArray(), " ")
0 1 2 3 4 5
oArr.RemoveRange 3, 2
WSH.Echo Join(oArr.ToArray(), " ")
0 1 2 5

Reverse 方法:翻转数组

时间复杂度 O(n)

Set oArr = CreateObject("System.Collections.ArrayList")
For i = 0 To 9
    oArr.Add i
Next
WSH.Echo Join(oArr.ToArray(), " ")
0 1 2 3 4 5 6 7 8 9
oArr.Reverse
WSH.Echo Join(oArr.ToArray(), " ")
9 8 7 6 5 4 3 2 1 0

Sort 方法:将数组内元素排序

时间复杂度 O(n * log(n))

Set oArr = CreateObject("System.Collections.ArrayList")
For i = 0 To 9
    oArr.Add Fix(Rnd() * 100)
Next
WSH.Echo Join(oArr.ToArray(), " ")
70 53 57 28 30 77 1 76 81 70
oArr.Sort()
WSH.Echo Join(oArr.ToArray(), " ")
1 28 30 53 57 70 70 76 77 81

TrimToSize 方法:使容量缩减为正好与当前元素个数相等

Set oArr = CreateObject("System.Collections.ArrayList")
For i = 0 To 9
    oArr.Add Fix(Rnd() * 100)
Next
WSH.Echo oArr.Capacity(), oArr.Count()
16 10
oArr.TrimToSize
WSH.Echo oArr.Capacity()
10

LastIndexOf 方法:返回数组中指定元素的索引

若有重复的元素,则返回最靠后的指定元素的索引。

若未找到元素,则返回 -1

Set oArr = CreateObject("System.Collections.ArrayList")
oArr.Add 1
WSH.Echo oArr.LastIndexOf(1)
0
oArr.Add(1)
WSH.Echo oArr.LastIndexOf(1), oArr.LastIndexOf(2)
1 -1

ToString 方法:返回类名

Set oArr = CreateObject("System.Collections.ArrayList")
WSH.Echo oArr.ToString(), TypeName(oArr)
System.Collections.ArrayList ArrayList

参考

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老刘1号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值