跳轉至內容

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
華夏公益教科書