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