BlitzMax/语言/数组
数组用于存储变量序列或元素。数组中的元素通过使用整数偏移量索引数组来访问。
索引数组的一般语法是
- ArrayExpression [ index1 , index2 等... ]
创建数组最常见的方法是在声明变量时
Local int_array[10]
这将使用一个 10 个元素的数组初始化 int_array 变量。您可以通过使用 [] 声明一个“空”数组
Local int_array[]
空数组与具有 0 个元素的数组相同。
评论:需要注意的是,与 Blitz Basic 的早期版本不同,数组现在是基于零的。也就是说,数组的第一个元素的索引为 0。因此,如果您声明了一个包含 4 个元素的数组,它们将从 0 到 3 索引。
数组也可以使用以下语法“动态”创建
- New [ Dimension1 , Dimension2 等... ]
这将返回一个指定维数的数组,其中每个元素都初始化为Null。例如
Local int_array:Int[] int_array=New Int[10]
可以使用以下语法创建“自动数组”
- [ Element1 , Element2 等... ]
这将返回一个包含指定元素的一维数组,例如
Local int_array[]=[1,2,3,4,5]
自动数组的每个元素必须具有完全相同的类型。如有必要,可以使用类型转换来强制执行此操作。
数组还提供以下方法
方法 | 描述 |
Sort( ascending=True ) | 对数组进行排序。 |
Dimensions:Int[]() | 获取数组维度。 |
数组还提供一个只读length字段,该字段返回数组中的元素总数。
以下是一些使用数组方法的示例
Strict Local arr:String[]=["some","random","strings","in","a","string","array"] arr.Sort 'sort ascending Print "Array in ascending order..." For Local t:String=EachIn arr Print t Next arr.Sort False 'sort descending Print "Array in descending order..." For Local t:String=EachIn arr Print t Next Local arr2[10,20,30,40] 'Dump array dimensions For Local i=EachIn arr2.Dimensions() Print i Next
数组实际上是对象,因此以下代码不会复制数组。它只是创建了另一个指向同一对象的变量。
Local arr:Int[] = [1,2,3] Local arr2:Int[] = arr
要复制数组,您必须使用切片。切片的语法为 array[from..to]。from 和 to 都可以省略;它们分别默认为 0 和最后一个索引。复制数组很简单
Local arr2:Int[] = arr[..]
使用切片调整数组大小
Local myArray[10] 'Create an array with 10 elements (0..9) myArray = myArray[..20] 'Increase number of elements in the array to 20 myArray = myArray[..5] 'Take the first 5 elements
请注意,您不能将切片与多维数组一起使用。
注意:这是一个稍微高级一点的话题,可能会让初学者感到困惑。
虽然您无法调整普通多维数组的大小,但您可以调整数组数组的大小(即一个一维数组,其中每个元素都是一个一维数组)。
您首先需要调整主数组的大小,然后循环遍历其中的每个元素并调整它们包含的数组的大小。
示例:
Local x :Int[][] 'Create our array of arrays x = x[ .. 5 ] 'resize the main array to have 5 elements 'loop through each new element in this array 'and resize the arrays that they contain For l = 0 Until Len( X ) x[ l ] = X[ l ][ .. 5 ] Next
要创建具有多个维度的数组,您可以指定由逗号分隔的索引
Local int_array1 : Int[4,4] 'create a 4x4 array Local int_array2 : Int[3,3,3] 'create a 3x3x3 array
然后,您可以像这样引用它们
int_array1[0,0] = 100 int_array2[2,1,0] = 1000
注意:这是一个稍微高级一点的话题,因此初学者可能会发现它令人困惑。
目前无法创建普通多维数组并对其进行自动初始化。但是,您可以稍微作弊一下
Local string_array:String[][] = [["Bob","Kate","Percy"],["Cecil","Edmund","Elizabeth"]] Print string_array[0][2] 'this will print Percy Print string_array[1][0] 'this will print Cecil
上面的代码实际上是创建一个类型为 String Array 的数组。如果您尝试以常规方式引用它,它将导致错误(数组维数不正确)。
Local string_array:String[][] = [["Bob","Kate","Percy"],["Cecil","Edmund","Elizabeth"]] Print string_array[0,0] 'this line would cause an error
如果您希望在类型中放置数组,则必须在使用它之前使用 New 初始化它们。您不能在 Field 后面的行上声明数组的大小。现在,您实际上可以直接声明 Field 数组的大小。但是,不能对 Type Globals 执行此操作。(因此有人可能可以整理一下这篇文章。如果有机会,我可能会自己做。)
Type MyType Field arr:Int[] ' Not initialized End Type Local a_type = New MyType a_type.arr = New Int[32] ' Initialize the array to 32 elements
为了让事情更简单,您可以在类型的 New 方法中创建数组。
Type MyType Field arr:Int[] ' Not initialized Method New() ' This function is called when a new MyType is created with New arr = New Int[32] End Method End Type Local a_type = New MyType ' No need to initialize the array
您也可以对多维数组执行此操作。只需在括号之间添加逗号即可。
Type MyType Field arr:Int[,,] ' Not initialized Method New() ' This function is called when a new MyType is created with New arr = New Int[10,10,10] End Method End Type Local a_type = New MyType ' No need to initialize the array
数组提供一个Sort方法,一个Dimensions方法和一个只读length字段。此外,还有三个您可能会发现有用的内部方法。
接受一个可选的 ascending 参数,默认值为 true。以下是对数组进行排序的示例
Strict Local arr:String[]=["some","random","strings","in","a","string","array"] arr.Sort 'sort ascending Print "Array in ascending order..." For Local t:String=EachIn arr Print t Next arr.Sort False 'sort descending Print "Array in descending order..." For Local t:String=EachIn arr Print t Next
返回一个包含数组维度的 int 数组。因此,例如 Int[10,5].Dimensions() 将返回 Int[2] 等于自动数组 [10,5]。
返回一个 Int 值,指示数组中的维度数。
指向表示数组元素数据类型的值的字节指针。
类型编码将返回以下值之一:TYPE_BYTE、TYPE_SHORT、TYPE_INT、TYPE_FLOAT、TYPE_LONG、TYPE_DOUBLE、TYPE_STRING、TYPE_OBJECT、TYPE_ARRAY、TYPE_POINTER。
返回一个 Int 值,元素数 * 4。
示例:
Local a:Int[2,2,2] Print a.numberOfDimensions 'Prints 3 Print a.elementTypeEncoding[0] 'Prints 105 if Int, 102 if Float, 36 if String Print a.sizeMinusHeader
如果要循环遍历数组的每个元素,可以使用 For-EachIn 循环
'create a 10 element array and pre-initialize the values Global myArray:Int[] = [0,1,2,3,4,5,6,7,8,9] For Local i:Int = EachIn myArray 'print the int contained in each array element Print i Next
这很好,但是如果您只想循环遍历其中的一部分呢?例如,最后五个。为此,您需要一个切片,如下所示
'create a 10 element array and pre-initialize the values Global myArray:Int[] = [0,1,2,3,4,5,6,7,8,9] 'loop through each element starting with the sixth element (0 based array index) For Local i:Int = EachIn myArray[5..] 'print the int contained in each array element Print i Next