首页 > 其他分享 >【原创】在 VBScript 中使用动态数组(ArrayList)

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

时间:2023-02-06 21:13:01浏览次数:62  
标签:Set VBScript ArrayList Value Add oArr 数组 vbInteger

环境要求

  • 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")

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

参考

标签:Set,VBScript,ArrayList,Value,Add,oArr,数组,vbInteger
From: https://www.cnblogs.com/OldLiu/p/VBScript_Using_NET_ArrayList.html

相关文章

  • javaScript - 数组的创建方式,数组的属性,数组的常用方法,数组的全部方法
    1.数组的创建方式//方式1vararray=newArray();array[0]="levi"//方式2vararray=newArray("png","jpg");//方式3vararray=["levi","mikasa"] 2.数组的属......
  • 数组的定义--Java基础027
    /*数组:数组是存储同一种数据类型数据的集合容器。数组的定义格式:数据类型[]变量名=new数据类型[长度];数组:存储同一种数据类型的集合容器.数组的特点:1.只能存储......
  • AcWing 791. 高精度加法C++数组实现
    高精度加法a,b均为正整数#include<iostream>usingnamespacestd;constintN=100010;intA[N],B[N],C[N];intAdd(inta[],intb[],intc[],intcnt){......
  • 树状数组基础
    树状数组(BinaryIndexedTree(BIT),FenwickTree)是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经......
  • Java中数组的使用
    Java中数组的使用介绍Java中数组的基本使用及需要注意的细节,对Java虚拟机的内存划分及数组在内存中的存储进行分析。Author:MsuenbDate:2023-02-06数组的概念数......
  • 【☀️C语言函数传参の结构体数组篇☀️】
    背景介绍C语言中函数参数传递的两种方式(“引用传递做函数参数”是C++的特性,C语言不支持。)(1)传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形......
  • 《剑指Offer》-4-二维数组中查找/力扣-240-搜索二维数组Ⅱ
    从最后一列的第一个数字开始比较,依次倒数第二列第一个数字、倒数第三列...找到第一个<=target的数字,这样可以将范围缩小到一列然后用二分查找快速判断目标元素有没有......
  • 数组封装新方法
    //查找数组中符合条件的元素Array.prototype.where=function(condition){varret=[];for(vari=0;i<this.length;i++){if(condition(this[i])){ret.......
  • 《剑指Offer》-53-在排序数组中查找数字/力扣-34
    Ⅰ统计一个数字在排序数组中出现的次数 intsearch(vector<int>&nums,inttarget){ intcount=0; for(intnum:nums){ if(num==target)count++; ......
  • php去除数组中为0的元素的实例分析
    利用array_diff()函数来去除数组中为0的元素。该函数用于比较两个数组的值并返回差集,只需要使用一个包含“0”数组和原数组进行比较即可。语法格式“array_diff($arr,[0]......