Java編程那些事兒48—多維陣列基礎鄭州遊戲學院 陳躍峰出自:http://blog.csdn.net/mailbomb
6.4 多維陣列基礎 在學校裡,由於一個班的人數不多,所以按照順序編號即可,當人數增多時,例如對於學校裡的人,在編號時就要增加層次,例如XX班XX號。在部隊中也是這樣,XX師XX團XX營XX連XX排XX班,這裡的層次就比較深了。為了管理資料的方便,一般要加深管理的層次,這就是多維陣列的由來。 多維陣列,指二維以及二維以上的數組。二維數組有兩個層次,三維數組有三個層次,依次類推。每個層次對應一個下標。 在實際使用中,為了使結構清晰,一般對於複雜的資料都是用多維陣列。 關於多維陣列的理解,最終的是理解數組的數組這個概念,因為數組本身就是一種複合資料型別,所以數組也可以作為數組元素存在。這樣二維數組就可以理解成內部每個元素都是一維數群組類型的一個一維數組。三維數組可以理解成一個一維數組,內部的每個元素都是二維數組。無論在邏輯上還是文法上都支援“數組的數組”這種理解方式。 通常情況下,一般用二維數組的第一維代表行,第二維代表列,這種邏輯結構和現實中的結構一致。 和一維數組類似,因為多維陣列有多個下標,那麼引用數組中的元素時,需要指定多個下標。
6.5 多維陣列文法 下面以二維數組為例,來介紹多維陣列的文法。
6.5.1 多維陣列聲明 多維陣列的聲明: 資料類型[][] 數組名稱; 資料類型[] 數組名稱[]; 資料類型 數組名稱[][]; 以上三種文法在聲明二維數組時的功能是等價的。同理,聲明三維數組時需要三對中括弧,中括弧的位置可以在資料類型的後面,也可以在數組名稱的後面,其它的依次類推。 例如: int[][] map; char c[][]; 和一維數組一樣,數組聲明以後在記憶體中沒有分配具體的儲存空間,也沒有設定數組的長度。
6.5.2 多維陣列初始化 和一維數組一樣,多維陣列的初始化也可以分為靜態初始化(整體賦值)和動態初始化兩種,其文法格式如下。
6.5.2.1 靜態初始化 以二維數組的靜態初始化為例,來說明多維陣列靜態初始化的文法格式。範例程式碼如下: int[][] m = { {1,2,3}, {2,3,4} }; 在二維數組靜態初始化時,也必須和數組的聲明寫在一起。數值書寫時,使用兩個大括弧嵌套實現,在最裡層的大括弧內部書寫數位值。數值和數值之間使用逗號分隔,內部的大括弧之間也使用逗號分隔。 由該文法可以看出,內部的大括弧其實就是一個一維數組的靜態初始化,二維數組只是把多個一維數組的靜態初始化組合起來。 同理,三維數組的靜態初始化文法格式如下: int[][][] b = { { {1,2,3}, {1,2,3} }, { {3,4,1}, {2,3,4} } }; 說明:這裡只是示範文法格式,數值本身沒有意義。
6.5.2.2 動態初始化 二維數組動態初始化的文法格式: 資料類型[][] 數組名稱 = new 資料類型[第一維的長度][第二維的長度]; 資料類型[][] 數組名稱; 數組名稱 = new 資料類型[第一維的長度][第二維的長度]; 範例程式碼: byte[][] b = new byte[2][3]; int m[][];m = new int[4][4]; 和一維數組一樣,動態初始化可以和數組的聲明分開,動態初始化只指定數組的長度,數組中每個元素的初始化是數組聲明時資料類型的預設值。例如上面初始化了長度為2X3的數組b,和4X4的數組m。 使用這種方法,初始化出的第二維的長度都是相同的,如果需要初始化第二維長度不一樣的二維數組,則可以使用如下的格式: int n[][]; n = new int[2][]; //只初始化第一維的長度 //分別初始化後續的元素 n[0] = new int[4]; n[1] = new int[3]; 這裡的文法就體現了數組的數組概念,在初始化第一維的長度時,其實就是把數組n看成了一個一維數組,初始化其長度為2,則數組n中包含的2個元素分別是n[0]和n[1],而這兩個元素分別是一個一維數組。後面使用一維數組動態初始化的文法分別初始化n[0]和n[1]。
6.5.3 引用數組元素 對於二維數組來說,由於其有兩個下標,所以引用數組元素值的格式為: 數組名稱[第一維下標][第二維下標] 該運算式的類型和聲明數組時的資料類型相同。例如引用二維數組m中的元素時,使用m[0][0]引用數組中第一維下標是0,第二維下標也是0的元素。這裡第一維下標的區間是0到第一維的長度減1,第二維下標的區間是0到第二維的長度減1。
6.5.4 獲得數組長度 對於多維陣列來說,也可以獲得數組的長度。但是使用數組名.length獲得的是數組第一維的長度。如果需要獲得二維數組中總的元素個數,可以使用如下代碼: int[][] m = { {1,2,3,1}, {1,3}, {3,4,2} }; int sum = 0; for(int i = 0;i < m.length;i++){ //迴圈第一維下標 sum += m[i].length; //第二維的長度相加 } 在該代碼中,m.length代表m數組第一維的長度,內部的m[i]指每個一維數組元素,m[i].length是m[i]數組的長度,把這些長度相加就是數組m中總的元素個數。