跳转至内容

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]。

numberOfDimensions

返回一个 Int 值,指示数组中的维度数。

elementTypeEncoding

指向表示数组元素数据类型的值的字节指针。

类型编码将返回以下值之一:TYPE_BYTE、TYPE_SHORT、TYPE_INT、TYPE_FLOAT、TYPE_LONG、TYPE_DOUBLE、TYPE_STRING、TYPE_OBJECT、TYPE_ARRAY、TYPE_POINTER。

sizeMinusHeader

返回一个 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
华夏公益教科书