關於陣列

當應用程式需要處理相同類型的資料時,通常會將這些資料儲存在集合中,以支援需要的資料維護操作,集合依需求有不同的儲存運算方式,陣列是其中比較單純的一種,可以透過索引存取儲存的資料,初學者通常從陣列開始學習集合的使用與相關的資料操作。

陣列的類型

儲存至陣列的內容視為陣列元素,陣列以根據維度分成幾種形式。



這是一個可以儲存六個元素的陣列,每一格可以儲存一個元素,每個元素都具有相同的型別,較為複雜的陣列物件可能包含了多列的儲存空間,其結構如同一個二維表格,如下圖便是一個典型的二維陣列物件。



更複雜的陣列可能包含多層架構,例如底下是包含三個二維陣列的多維陣列:



定義一維陣列

一維陣列是最簡單的陣列結構,它可以儲存一個以上的同類型元素,例如某個班級的學生姓名,透過陣列的維護即可管理這個班級的學生清單。

建立一個陣列物件所需的語法如下:
type[] arrayName = new type[arrSize] ;
其中 type 指定了陣列所要儲存的資料型別, arrayName 為陣列物件的變數名稱, arrSize則是 arrayName 陣列物件所能容納的元素個數。

假設需要能夠存放 6 個整數值的陣列,定義的語法如下:
int[] arrayInt = new int[6] ; 
這一段程式碼建立一個名稱為 arrayInt,可以用來儲存 6 個整數的陣列,如下圖:



除了在陣列物件建立之後,再逐一將指定的元素插入陣列,你也可以選擇在陣列一開始宣告時直接進行初始化,語法如下:
type[] array= {value1, value2, value3, …,valueN} 
加入陣列的值,必須使用大括弧將其包圍起來,而陣列物件建立的時候,這些值則一一被加入新建立的陣列變數 array。

陣列索引

每一個儲存在陣列裏的元素,均會有一個相對應的索引值,你可以利用這個索引值存取特定位置上的陣列元素,陣列的索引值從 0 開始,一個長度為 arrSize 的陣列物件,元素索引值從 0~arrSize-1 ,以上一節說明的 arrayInt 為例,其長度為6,索引值則是從 0 ~5。

陣列的索引是一個int型態的數值,你可以直接指定一個整數值進行陣列元素的存取,例如以下的片段:
varValue = arrayInt[5];
其中回傳 intArray 陣列中所儲存的第6個元素值,而這個值被儲存至變數 varValue。



你也可以指定一個運算結果等於整數的運算式當作索引值,如下式:
varValue = intArray[4+5];
這個運算式回傳 intArray 陣列中的第 10 個元素值。

若是想要將一個值儲存至陣列的特定位置,則必須使用以下的語法,其中將 value 儲存至陣列 objArray 的第 5 個索引位置。
objArray[4] = value
存取陣列元素除了指定索引值之外,其語法與指定一般的變數並沒有兩樣,當你進行陣列索引以 0 為基礎,第一個元素的索引值一定等於 0, 範圍將落在 0 到陣列所能儲存的元素數目減 1 的值之間,當你利用索引值存取物件元素,不可以中括弧裏面指定範圍之外的索引值,否則將導致陣列索引超出界限的程式例外錯誤。

陣列的特性

陣列是一種 Array 型別,其定義了包含索引以及容量等專屬的陣列特性,這些特性都可以透過Array 進行存取,由於每一個宣告為陣列的變數都是一個Array,因此我們直接利用變數存取陣列特性,例如以下這一段程式碼:
int[] x = new int[6];
Console.WriteLine(x. Length) ;
第 1 行宣告一個可以儲存 6 個整數的陣列 x,第 2 行引用 Length 取得此陣列的長度,結果是 6。

下表列舉三個與陣列長度以及索引值有關的屬性:

屬性說明
Length陣列長度,代表陣列可以儲存的元素數量,也就是陣列的容量。
GetLowerBound取得陣列的開始索引值。
GetUpperBound取得陣列的結束索引值。

接下來的範例建立一個陣列物件,並且指定其容量大小,同時藉由索引值取得集合中各個元素的值。
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("以下宣告一個整數型別陣列物件intArray !!");
        int[] intArray = new int[10];
        Console.WriteLine
            ("陣列intArray 的長度為{0} ,
       開始索引值為{1},結束索引值為{2} \n",
            intArray.Length, intArray.GetLowerBound(0),
            intArray.GetUpperBound(0));
        Console.WriteLine(
      "以下宣告一個字串型別陣列物件strArray !!");

        string[] strArray = new string[20];
        Console.WriteLine(
            "陣列strArray 的長度為{0} ,
       開始索引值為{1},結束索引值為{2} \n",
             strArray.Length,strArray.GetLowerBound(0),
             strArray.GetUpperBound(0));
        Console.ReadLine();            
    }
}

粗體標示的程式碼各宣告一個陣列變數-intArray 以及 strArray ,其中 intArray 陣列只能儲存 int 整數型別的數值, strArray 則只能儲存字串型別的物件,由於陣列是一種物件,因此使用 new 關鍵字建立其實體。

建立陣列物件同時指定的容量,表示將來這個陣列物件所能容納的元素數量,上述程式碼建立的intArray物件只允許儲存最多十個整數型別的數值元素,而第二個物件 strArray 則允許儲存多達20個字串型別的物件元素。

接下來的程式碼,分別將先前建立的兩組陣列性質輸出,這些性質可以經由屬性以及方法取得。

Length 為陣列物件所提供的屬性,利用這個屬性,你可以取得陣列物件允許儲存的容量值。

GetLowerBound 為一個方法,回傳陣列物件的第一個索引值,陣列物件的第一個索引值一律被設定為 0 ,這一點必須特別注意,而且你無法改變其容量。 GetUpperBound 方法傳回陣列物件的最後一個索引值。

GetLowerBound 與GetUpperBound 這兩個方法均接受一個參數,這個參數指定回傳的結果是屬於那個維度的陣列,陣列本身可以含有一個以上的維度,此範列均是簡單的一維陣列,因此輸出 0 。

以下是執行結果:
以下宣告一個整數型別陣列物件 intArray !!
陣列 intArray 的長度為 10 ,開始索引值為 0,結束索引值為 9

以下宣告一個字串型別陣列物件 strArray !!
陣列 strArray 的長度為 20 ,開始索引值為 0,結束索引值為 19

必須特別注意的是,陣列容量的大小,在建立的時候便固定了,熟悉了陣列的運用之後,後續我們還會介紹另外還有一種可以改變容量大小的陣列物件 ArrayList ,它是一種動態陣列物件,若是無法預知陣列將會儲存多少元素,使用動態陣列是比較好的選擇。

在這篇教學中,我們初步討論了陣列,不同整數等型別的資料,陣列是一種物件,有相關的屬性以及方法成員,在這裏只需先瞭解如何撰寫程式碼即可,「物件導向」中的教學,對於物件將會有完整的說明與討論。







沒有留言: