二維陣列

二維陣列類似棋盤的二維表格,元素存放在欄與列形成的方格中,每列是一維陣列,欄數則是這一列的容量。根據結構分成兩種形式-矩形陣列 (Rectangular array) 以及鋸齒形陣列(Jagged array) ,兩者的差異在於,矩形陣列每一列可以容納的元素數量是相同的,鋸形陣列則剛好相反,必須指定每一列陣列的長度

矩形陣列

二維矩形陣列可以看作是由數個相同大小的一維陣列所組成的二維表格,並且以兩個索引值來表示特定位置的元素。宣告二維陣列,必須指定兩個索引,分別是代表行數的 colNum 以及列數的 rowNum,並且以一個逗號作分隔,語法如下:
type[,] objArray = new type[rowNum,colNum]
第一個索引值 rowNum 為表格中的列,第二個索引值 colNum 是一維陣列中代表元素位置的索引值,也就是表格中的欄位,一般也將其稱作為行。

若是要存取二維陣列,必須同時指定其所在位置的兩個索引值,例如以下這一行程式碼,其中會將位於第四列,第二行的元素取出:
objArray[3,1]
以下的圖示定義了一個二維陣列 arrayInt[3,6]:




ayrrayInt 由三個一維陣列所組成,每個一維陣列的長度為 6 ,其中的元素同樣必須透過索引值進行存取,只是必須指出這個元素所在位置的一維陣列,例如圖中的 arrayInt[2,0]可取出第三個陣列裏的第一個元素,同理, arrayInt[0,5] 取出第一個陣列的第六個元素。
class Program
{
    static void Main(string[] args)
    {
        string[,] intArray = new string[5, 6];
        Console.WriteLine
               ("intArray 是一個5x6 的{0} 維陣列!! \n", 
                  intArray.Rank);
        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j < 6; j++)
            {
                intArray[i, j] = 
          "value" + i.ToString() + j.ToString();
            }
        }
        Console.WriteLine("以下列出intArray 陣列內含元素 !! \n");
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine("以下為第 {0} 列陣列!!\n", i);
            for (int j = 0; j < 6; j++)
            {
                Console.WriteLine
                ("陣列元素intArray[{0},{1}] : {2} ",
                    i, j, intArray[i, j]);
            }
            Console.WriteLine();
        }
        Console.ReadLine();
    }
}
宣告二維陣列 intArray ,使用巢狀迴圈逐一列舉陣列中的每一列,將指定的元素儲存至每一個陣列中。接下來的另外一個巢狀迴圈,外部迴圈依序瀏覽每個一維陣列,內部迴圈則將陣列的內容值逐一取出。 以下來看輸出結果:
intArray 是一個 5x6 的 2 維陣列 !!
以下列出 intArray 陣列內含元素  !!
以下為第 0 列陣列 !!

陣列元素 intArray[0,0] : value00
陣列元素 intArray[0,1] : value01
陣列元素 intArray[0,2] : value02
陣列元素 intArray[0,3] : value03
陣列元素 intArray[0,4] : value04
陣列元素 intArray[0,5] : value05

以下為第 1 列陣列 !!

陣列元素 intArray[1,0] : value10
陣列元素 intArray[1,1] : value11
陣列元素 intArray[1,2] : value12

… …

以下為第 4 列陣列 !!

陣列元素 intArray[4,0] : value40
陣列元素 intArray[4,1] : value41
陣列元素 intArray[4,2] : value42
陣列元素 intArray[4,3] : value43
陣列元素 intArray[4,4] : value44
陣列元素 intArray[4,5] : value45
從結果來看,二維陣列輸出同樣是二階層的資料結構

 不規則二維陣列

另外一種二維陣列為不規則陣列,不規則陣列與矩形陣列最大的差異,在於它每一列陣列的長度並不相同,你可以將其想像成不同長度的一維陣列組合成的二維陣列,例如下圖是一個典形的不規則陣列的結構。



建立一個不規則二維陣列所使用的語法不同於上述的矩形陣列,你必須使用兩個 [] 運算子,其形式如下:
type[][] objJagArray = new type[rowNum][]
宣告一個鋸齒形二維陣列,只需指定其列數,由於不規則二維陣列的每一列長度並不一定相同,因此必須於物件建立之後,根據需要逐一指定每一列的長度,也就是可以存放的元素數目,以下為指定每一列陣列長度的語法:
objJagArray[0] = new type[value0] ; 
objJagArray[1] = new type[value1] ; 
objJagArray[2] = new type[value2] ; 
               …
objJagArray[n] = new type[valueN] ; 
其中將鋸齒形陣列逐一拆開,分別指定其大小,完成之後便可以利用索引值取得其中的特定元素,同樣的,此時必須利用兩個 [] 運算子,指定其索引,其形式如下:
objJagArray[n][m] ; 
這一段語法用以取得第 n 列、第 m 個位置的元素值。

底下為鋸齒形陣列的示意圖,比較上述的矩形陣列,除了以兩個括弧取代逗(,)之外,最重要的差異在於陣列的第二個維度的定義。



以下嘗試建立一個鋸齒形陣列,逐一指定每一列的長度之後,將指定的元素儲存至陣列當中。
class Program
{
    static void Main(string[] args)
    {
        int rwoNumber = 5;
        string[][] strArray = new string[rwoNumber][];
        for (int i = 0; i < rwoNumber; i++)
        {
            strArray[i] = new string[i + 2];
        }
        for (int i = 0; i < rwoNumber; i++)
        {
            for (int j = 0; j < strArray[i].Length; j++)
            {
                strArray[i][j] = "value" + i + j;

            }
        }
        for (int i = 0; i < rwoNumber; i++)
        {
            Console.WriteLine
            ("以下為陣列strArray[{0}][{1}] 所包含元素!! \n",
            i, strArray[i].Length);
            for (int j = 0; j < strArray[i].Length; j++)
            {
                Console.Write(strArray[i][j] + " : ");
            }
            Console.WriteLine("\n");
        }
        Console.ReadLine();
    }
}
首先建立一個長度等於 5 的鋸齒形二維陣列 strArray ,接下來使用迴圈逐一設定各列長度,指定為列數加 2 ,完成後第一列長度為 2 ,第二列為 3 ,依此類推。

完成陣列長度的設定,透過巢狀迴圈指定二維陣列中每個索引位置的值為字串 value 加上列數與欄位的字串。 最後使用另外一個巢狀迴圈輸出陣列中所有的元素值。

以下的輸出結果,呈現不規則陣列的結構:
以下為陣列 strArray[0][2] 所包含元素 !!

value00 : value01 :

以下為陣列 strArray[1][3] 所包含元素 !!

value10 : value11 : value12 :

以下為陣列 strArray[2][4] 所包含元素 !!

value20 : value21 : value22 : value23 :

以下為陣列 strArray[3][5] 所包含元素 !!

value30 : value31 : value32 : value33 : value34 :

以下為陣列 strArray[4][6] 所包含元素 !!

value40 : value41 : value42 : value43 : value44 : value45 :





沒有留言: