10-2 二維陣列

您可以使用多維陣列( Multi-dimensional arrays )來儲存矩陣值 ( 陣列的陣列的陣列,依此類推)。二維陣列( Two-dimensional array )(陣列的陣列)類似於有很多列(Row),每一列都是擁有一堆元素的一維陣列,二維陣列是多維陣列的一個例子,了解如何使用二維陣列,就可以了解如何使用多維陣列。

• 宣告二維陣列參考

二維陣列只需要增加一對[]括弧,除此之外,建立及使用的程序與一維陣列相同。以下是宣告二維陣列參考的語法。

type[][] array_identifier;
                            

其中:

  • type 表示儲存在陣列中的值為基本資料型態或是物件型態。
  • [][]用來告知編譯器,您宣告的為二維陣列參考
  • array_identifier 是您指派給陣列的名稱。

底下的範例說明如何宣告 int 型態的二維陣列參考:

int[][] yearlySales;
                            

一個二維陣列參考名稱可以參考至二維陣列實例,當您如上宣告一個二維陣列參考名稱時,它還沒有參考至任何的二維陣列物件,也就是 yearlySales 參考至 null。

• 實例化二維陣列

以下是實例化二維陣列的語法:

array_identifier = new type[number_of_arrays][length];
                            

其中:

  • number_of_arrays 為 array_identifier 陣列中擁有的一維陣列數量。
  • length 是 array_identifier 中每個一維陣列的長度。

以下的實例示範如何宣告一個二維陣列,它擁有 5 個一維陣列,每個一維陣列的長度為 4 ,通常稱之為 5 乘 4 陣列(5x4)

int[][] yearlySales = new int[5][4];
                            

圖10-6 宣告二維陣列

如果是宣告二維的物件陣列的話,則可以如下宣告:

Integer[][] yearlySales = new Integer[5][4];
                            

當您實體化陣列物件時,每一個元素都會被初始化為您所指定之型態的預設初始值,這在表 1-1 中已經有列出,注意如果是物件陣列的話,則每一個元素都參考至 null,也就是都不參考至任何的物件。

圖10-7 宣告二維陣列

• 存取二維陣列元素

當設定二維陣列中的值時,利用兩個數值當作陣列的索引,其中第一個索引值代表列( Row ),而第二個數值代表行( Column ),底下顯示如何設定 yearlySales 陣列的值:

int[][] yearlySales = new int[5][4];
yearlySales[0][0] = 10;
yearlySales[0][1] = 15;
yearlySales[0][2] = 18;
yearlySales[1][0] = 10;
yearlySales[2][0] = 14;
yearlySales[3][0] = 20;
                            

上面的程式碼會使 yearlySales 陣列內容變成如下:

圖10-8 二維陣列的索引與元素位置

由於 int 型態的陣列實例預設初值是 0 ,所以上圖中 yearlySales 中未被指定新值的陣列元素值仍為 0。

• 宣告、實例化及初始化二維陣列

如果在宣告二維陣列的時候,您已經知道想在陣列中所存放的值為何,則可以在同一行陳述中,對陣列進行宣告、實例化及設定初值,以下為結合宣告、實例化及設定值的語法:

type[][] array_identifier = {{,分隔的值或運算式},{,分隔的值或運算式}};
                            

其中:

  • type 用來表示儲存在陣列中元素之型態。
  • [][]用來告知編譯器,此宣告為二維陣列。
  • array_identifier 是所使用的陣列名稱。
  • {,分隔的值或運算式}表示一連串您想要儲存在該一維陣列內的值,或一連串的運算式,每個一維陣列以{}及逗號分隔。

以下的程式碼結合陣列的宣告、實例化及初始化:

int[][] yearlySales = {{0, 1, 2, 3},
                            {4, 5, 6, 7},
                            {8, 9, 10, 11}};
                            

圖10-9 二維陣列宣告、實例及初始後的元素值

如果在使用 new 配置二維陣列後想要一併指定初值,則可以如下撰寫:

int[][] yearlySales =
            new int[][]{{0, 1, 2, 3},
                            {4, 5, 6, 7},
                            {8, 9, 10, 11}};
                            

• length 屬性與二維陣列

在您宣告二維陣列之後,例如像圖 10-9 的 yearlySales,您可以使用 yearlySales.length 來取得該二維陣列中包括幾個一維陣列,例如以下的程式碼中會顯示結果為 3,也就是yearlySales 包括三個一維陣列:

System.out.println(yearlySales.length);
                            

對於二維陣列來說,您可以使用[]並指定索引,表示您將參考至哪一個一維陣列,例如在圖 10-9 中 yearlySales[0]將參考至第一個一維陣列,yearlySales[1]將參考至第二個一維陣列,yearlySales[2]將參考至第三個一維陣列。

圖10-10 使用[]與索引指定參考一維陣列

所以如果您想要取得二維陣列中某列(Row)一維陣列的長度 , 則 可 以 使 用 像 yearlySales[0].length 、yearlySales[1].length、yearlySales[2].length 來取得。

在使用 for 迴圈來存取陣列時,您要知道陣列的邊界,您可以使用以上所說明的 length 之用法來取得邊界長度,程式碼10-5 示範了如何使用巢狀 for 迴圈來顯示二維陣列的元素值。

public class TwoDimArray{
    public static void main(String[] args){
        int[][] yearlySales = {{0, 1, 2, 3},
                {4, 5, 6, 7},
                {8, 9, 10, 11}};
        for (int i = 0;
             i < yearlySales.length;
             i++){
            for (int j = 0;
                 j < yearlySales[i].length;
                 j++){
                System.out.print(
                        yearlySales[i][j] + " ");
            }
            System.out.println();
        }
    }
}
                            
程式碼 10-5 TwoDimArray.java

執行結果如下:

圖10-11 程式碼 10-5 的執行結果

• foreach 語法與二維陣列

二維陣列實際上是陣列的陣列,您可以結合 foreach 語法來存取陣列元素,先直接來看個程式碼實例,程式碼 10-6 使用foreach 迴圈改寫程式碼 10-5 來顯示陣列元素。

public class TwoDimArray2{
    public static void main(String[] args){
        int[][] yearlySales = {{0, 1, 2, 3},
                {4, 5, 6, 7},
                {8, 9, 10, 11}};
        for (int[] row : yearlySales){
            for (int element : row){
                System.out.print(element + " ");
            }
            System.out.println();
        }
    }
}
                            
程式碼 10-6 TwoDimArray2.java

第 6 行的 foreach 迴圈先使用一維陣列參考名稱 row,循序參考至 yearlySales 上每一列(Row)一維陣列,接下來第 7 行的 foreach 迴圈再從 row 所參考的一維陣列上,循序取出陣列元素,並在第 8 行中顯示出來,程式的執行結果與程式碼 10-5 是相同的,可參考圖 10-11。

• 不規則陣列

二維陣列實際上是陣列的陣列,更進一步的講,是使用一維陣列來管理數個一維陣列,以 yearlySales 來 說 ,yearlySales[0]、yearlySalse[1]等都可以參考至一維陣列物件,所以您也可以讓它們分別參考至不同長度的一維陣列。

首先您要先宣告二維陣列參考名稱,並以實例化的方式告訴它即將管理幾個一維陣列,例如下面的程式碼中,arr 將管理兩個一維陣列:

int[] arr;
arr = new int[2][];
                            

接下來分別實例化兩個一維陣列,例如分別實例化長度為 3 與 5 的一維陣列:

arr[0] = new int[3];
arr[1] = new int[5];
                            

如您所見的,這個二維陣列並不是像之前所宣告的四四方方的二維陣列,而是每一列(Row)的長度都不相同,所以稱之為不規則陣列

程式碼 10-7 示範了如何宣告不規則陣列,並顯示當中的元素值。

public class TwoDimArray3{
    public static void main(String[] args){
        int arr[][];

        arr = new int[2][];
        arr[0] = new int[3];
        arr[1] = new int[5];

        // 設定陣列元素值
        for (int i = 0; i < arr.length; i++){
            for (int j = 0; j < arr[i].length; j++){
                arr[i][j] = j + 1;
            }
        }

        // 顯示陣列元素值
        for (int i = 0; i < arr.length; i++){
            for (int j = 0; j < arr[i].length; j++){
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
    }
}
                            
程式碼 10-7 TwoDimArray3.java

執行的結果如下所示,您可以看到每一列(Row)的長度是不相同的:

圖10-12 程式碼 10-7 的執行結果

相關資料

下列參考資料能夠對本章節所討論的話題提供 更詳細的說明:

  • 一個對程式設計者很實用的指引,有數百個完整、可運作的範例:The Java Tutorial