B4X数组是可以通过索引选择的数据或对象的集合。它是一种非可视化的数据容器,在B4X中作为变量使用,用于在单个变量下存储多个数据项。数组中的每个数据项称为元素,每个元素都可以通过其位置或索引来访问。
一、数组的维度
数组按其维度可划分为单维数组、二维数组和多维数组
Dim arr(5) As String声明了一个单维数组,共有5个数据元素,数组长度是5。
Dim arr(5,3) As String声明了一个二维数组,共有15个数据元素,数组长度是5。
Dim arr(5,3,4) As String声明了一个三维数组,共有60个数据元素,数组长度是5。
我们可以用下面比喻深入了解不同维度数组的概念:
单维数组是一条线,线上排列了5个数据元素,其数组长度等于元素数量。
二维数组是一张纸,上面排列了3行5列元素共15个,其数组长度等于列数5。
三维数组是一本书,共有3行5列的页4页,元素共60个,其数组长度等于列数5。
四维数组是一个书架、五维数组是有多个书架的图书室等等以此类推。
二、动态数组与静态数组
静态数组是在编译时定义并分配内存空间的数组,其大小在编译时被确定且无法修改。静态数组的大小通常在声明时指定,如:Dim arr(5) As String,arr为静态单维数组,其固定长度为5,最大索引为4,您不能给ar(5)赋值,因为没有ar(5)这个元素。
动态数组是在运行时创建和销毁的数组,其大小可以根据需要进行调整。动态数组在声明时不指定长度,其长度值可以动态改变。在B4X中仅单维数组可以声明为动态数组,声明后用Array As语句初始化数组。多维数组可以声明为List。
例如:
Dim arr() As Int
arr()= Array As Int (1,2,3)
想要更改arr()大小,只能使用Array As语句再次初始化。
三、声明数组
语法:Private(Public) <变量名>([单维长度[,二维长度,[...]]]) As 数据类型
声明为局部变量用Private,全局变量用Public或Dim。
变量名后面的括号中没有逗号,则为单维数组,有一个逗号为二维数组,有两个打逗号为三维数组。
数据类型是指数组存放的数据的类型,如String、Int、Double、Object等,如果数据非单一类型,而是混合类型,则数据类型必须用Object。
例如:
Public LastName(50) As String 一维字符串静态数组,元素总数 50。
Public Matrix(3, 3) As Double 二维双精度值静态数组,元素总数 9。
Public Data(3, 5, 10) As Int 三维整数静态数组,元素总数 150。
Public btn(3) As Object=Array As String(1,"bt1",Button1) 单维混合静态数组
Public LastName() As String 一维字符串动态数组,元素总数可用Array As 语句改变。
注意:
1、数组中每个维度的第一个索引是 0。
LastName(0), Matrix(0,0), Data(0,0,0)
2、最后一个索引等于每个维度中的项目数减 1。
LastName(49), Matrix(2,2), Data(2,4,9)
3、B4R 只支持一维数组!
4、多个数组的声明可以用多行声明,也可以用单行声明,和其它变量声明规则一样。
例如:
Public LastName(10) As String
Public FirstName(10) As String
Public Address(10) As String
Public City(10) As String
或者
Public LastName(10), FirstName(10), Address(10), City(10) As String
5、声明数组的一种更通用的方法是使用变量。
Public NbPers = 10 As Int
Public LastName(NbPers) As String
Public FirstName(NbPers) As String
Public Address(NbPers) As String
Public City(NbPers) As String
我们将变量声明为Public NbPers = 10 As Int并将其值设置为 10。
然后我们用这个变量来声明数组,而不是像以前那样用数字 10 来声明。
最大的优点是如果在某个时候我们需要更改项目的数量,我们只更改一个值。
四、访问多维数组变量
一般使用循环遍历法访问多维数组变量中的各个元素,下面示例显示如何访问三维数组中的所有元素:
1、访问使用常量定义数组长度的数组:
Public Data(3, 5, 10) As Int
For i = 0 To 2
For j = 0 To 4
For k = 0 To 9
Data(i, j, k) = ...
Next
Next
Next
2、访问使用变量定义数组长度的数组:
Public NbX = 2 As Int
Public NbY = 5 As Int
Public NbZ = 10 As Int
Public Data(NbX, NbY, NbZ) As Int
For i = 0 To NbX - 1
For j = 0 To NbY - 1
For k = 0 To NbZ - 1
Data(i, j, k) = ...
Next
Next
Next
五、关键字Array的用法
关键字Array用于创建指定类型的单维数组。
语法为: Array [As type] (list of values)。
如果省略了类型type,则将创建一个对象数组。
list是单维数组的元素列表。
Dim Days() As String = Array As String("Sunday", "Monday", ...)
Array常用于将固定数量的项添加到控件的待选项列表中。
Dim combobox1 As ComboBox
combobox1.Initialize("combobox1")
combobox1.Items.Clear
combobox1.Items.AddAll( Array As String("学士","硕士","博士","其他"))
Root.AddView(combobox1,10,100,120,30)
六、数组的引用
两个数组之间是通过数据引用传递数据的,比如:数组2 = 数组1,数组2是通过对数组1的数据引用获得数值的,这个情况下,两个数组中任何一个数组数据发生变化,另一个数组的相应数据也会发生同样的变化。因此,改变一个数组元素的值,另一个数组相应值也会改变。
例如:
Dim ar1(3) As Int=Array As Int(1,2,3)
Dim ar2(3) As Int=ar1
ar1(0)=10 ' 将数组ar1的第一个值更改为10
Log(ar2(0)) ' 数组ar2的第一个元素的值也会变为10
ar2(1)=20 ' 将数组ar2的第二个值更改为20
Log(ar1(1)) ' 数组ar1的第二个元素的值也会变为20
要解决这个问题,我们需要将数组ar2初始化并赋值,作为一个新的与ar1无关联的数组使用。如下代码:
Dim ar1(3) As Int=Array As Int(1,2,3)
Dim ar2(3) As Int=Array As Int(1,2,3)
ar1(0)=10 ' 将数组ar1的第一个值更改为10
Log(ar2(0)) ' 数组ar2的第一个元素的值仍为1
ar2(1)=20 ' 将数组ar2的第二个值更改为20
Log(ar1(1)) ' 数组ar1的第二个元素的值仍为2