您可以使用多維陣列( Multi-dimensional arrays )來儲存矩陣值 ( 陣列的陣列的陣列,依此類推)。二維陣列( Two-dimensional array )(陣列的陣列)類似於有很多列(Row),每一列都是擁有一堆元素的一維陣列,二維陣列是多維陣列的一個例子,了解如何使用二維陣列,就可以了解如何使用多維陣列。
二維陣列只需要增加一對[]括弧,除此之外,建立及使用的程序與一維陣列相同。以下是宣告二維陣列參考的語法。
type[][] array_identifier;
其中:
底下的範例說明如何宣告 int 型態的二維陣列參考:
int[][] yearlySales;
一個二維陣列參考名稱可以參考至二維陣列實例,當您如上宣告一個二維陣列參考名稱時,它還沒有參考至任何的二維陣列物件,也就是 yearlySales 參考至 null。
以下是實例化二維陣列的語法:
array_identifier = new type[number_of_arrays][length];
其中:
以下的實例示範如何宣告一個二維陣列,它擁有 5 個一維陣列,每個一維陣列的長度為 4 ,通常稱之為 5 乘 4 陣列(5x4)
int[][] yearlySales = new int[5][4];
如果是宣告二維的物件陣列的話,則可以如下宣告:
Integer[][] yearlySales = new Integer[5][4];
當您實體化陣列物件時,每一個元素都會被初始化為您所指定之型態的預設初始值,這在表 1-1 中已經有列出,注意如果是物件陣列的話,則每一個元素都參考至 null,也就是都不參考至任何的物件。
當設定二維陣列中的值時,利用兩個數值當作陣列的索引,其中第一個索引值代表列( 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 陣列內容變成如下:
由於 int 型態的陣列實例預設初值是 0 ,所以上圖中 yearlySales 中未被指定新值的陣列元素值仍為 0。
如果在宣告二維陣列的時候,您已經知道想在陣列中所存放的值為何,則可以在同一行陳述中,對陣列進行宣告、實例化及設定初值,以下為結合宣告、實例化及設定值的語法:
type[][] array_identifier = {{,分隔的值或運算式},{,分隔的值或運算式}};
其中:
以下的程式碼結合陣列的宣告、實例化及初始化:
int[][] yearlySales = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
如果在使用 new 配置二維陣列後想要一併指定初值,則可以如下撰寫:
int[][] yearlySales = new int[][]{{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
在您宣告二維陣列之後,例如像圖 10-9 的 yearlySales,您可以使用 yearlySales.length 來取得該二維陣列中包括幾個一維陣列,例如以下的程式碼中會顯示結果為 3,也就是yearlySales 包括三個一維陣列:
System.out.println(yearlySales.length);
對於二維陣列來說,您可以使用[]並指定索引,表示您將參考至哪一個一維陣列,例如在圖 10-9 中 yearlySales[0]將參考至第一個一維陣列,yearlySales[1]將參考至第二個一維陣列,yearlySales[2]將參考至第三個一維陣列。
所以如果您想要取得二維陣列中某列(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
執行結果如下:
二維陣列實際上是陣列的陣列,您可以結合 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)的長度是不相同的:
下列參考資料能夠對本章節所討論的話題提供 更詳細的說明: