7-3 二維陣列處理
既然陣列是由若干個相同資料型態的變數整合而成,變數的排列格式也延伸了不同的陣列格式。如果所有變數排列成一行或一列,則稱之為『一維陣列』(如 array[]);如果排列成平面形狀,則稱為『二維陣列』(如 array[][]);如果是立體形狀,則為『三維陣列』(如 array[][][]);如是四度空間型態,則是『四維陣列』(如 array[][][][]),其中每一維都需要一個變數作為指標,索引其相對位置。各種陣列型態都有其運用範圍,如沒有特殊情況的話,還是一維與二維陣列的應用最普遍,本書僅介紹到二維陣列,更多維數陣列的處理方式,也大致相同的。 7-3-1 二維陣列宣告 將變數排列成『縱橫』的平面形狀,則稱之為『二維陣列』,如圖 7-3 所示。二維陣列需要兩個位置指標,如 score[x][y] 變數,前面指標(如 x)是標示第幾行數(由 0 開始); 第二個指標(如 y),則標示第幾列數;如是 4 * 3 陣列共計有 12 個相同型態(int)變數的元素。另外,陣列被宣告完成之後(如 int score[][] = { ..}),則 score.length 變數儲存該陣列的行數;又 score[x].length 儲存該行(x)元素的數目(即是列數目)。宣告語法如下所示:
圖 7-6 二維陣列的結構
第一行語法是宣告產生二維陣列,第二行則再給予初值。如敘述句如:int [] [] score = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}};則產生各個元素與變數內容如下: score[0][0] = 1, score[0][1]=2, score[0][2]=3 =>score[0].length=3 score[1][0] = 4, score[1][1]=5, score[1][2]=6 =>score[1].length=3 score[2][0] = 7, score[2][1]=8, score[2][2]=9 =>score[2].length=3 score[3][0] = 10, score[3][1]=11, score[3][2]=12 =>score[3].length=3 score.length = 4 7-3-2 範例研討:印出二維陣列內容 (A)程式功能:Ex7_4.java 請編寫一程式,印出陣列 score [] [] = {{1, 2, 3}, {4, 5, 6},{7, 8, 9}, {10, 11, 12}} 內容並依照相對位置排列(平面形狀)。 期望操作介面如下:
(B)製作技巧研討: 吾人利用 x 與 y 變數作為陣列位置索引,x 是行數指標,y 為列數指標,則任何一元素可由 score[x][y] 表示。如欲平面型態印出陣列內容,則需要二重迴圈敘述,外迴圈標示共計列印幾行(x = 0, 1, …, score.length);內迴圈索引每行的列數(y = 0, 1, 2, …, score[x].length)。 (C)程式範例:
(D) 程式重點說明: (1) 第 5~8 行:『int score[][] = { …};』。宣告二維陣列並給予初值。 (2) 第 11~15 行:『for(x=0; x<score.length; x++) {…}』。外迴圈指定列印行數,其中 score.length 表示該陣列的行數。 (3) 第 12~13 行:『for(y=0; y<score[x].length; y++){…}』。內迴圈指定每行的列的數目,其中 score[x].length 表示該行(x)列的數目。 (4) 第 13 行:『System.out.printf("\t%2d", score[x][y]);』。列印 score[x][y] 元素的內容,列印格式是開始先跳一個『Tab』(\t)定格,再以兩個位置的格式列印整數(%2d)。 (5) 第 14 行:『System.out.printf(“\n”);』。每行列印完成之後,跳至下一行。 7-3-3 自我挑戰:二維陣列內容加倍 (A)程式功能:PM7_4.java 請編寫一程式,請修改 Ex7_2 範例,將陣列 score [][] = {{1, 2, 3}, {4, 5, 6},{7, 8, 9}, {10, 11, 12}} 內容加 3 倍,再依照相對位置排列(平面形狀)。 期望操作介面如下:
(B)製作技巧提示: 我們建構一個比較容易擴充的程式,將 score[][] 宣告成類別變數,使其允許類別內所有方法使用,又將列印陣列的功能製作成一個獨立的 disp_arr() 方法,程式架構如圖 3-2 所示。
(C) 程式片段
7-3-4 範例研討:印出二維陣列的轉陣列(S-T) (A)程式功能:Ex7_5.java 請編寫一程式,請將陣列 score [][] = {{1, 2, 3}, {4, 5, 6},{7, 8, 9}, {10, 11, 12}} 轉移(S-T),再依照相對位置排列(平面形狀)。 期望操作介面如下:
(B) 製作技巧 我們只要將由陣列內容取出的次序轉換就可以,原陣列取出是 score[i][j],轉移陣列取出是次序是 score[j][i]。當外迴圈 i=0 時,印出順序 (j=0、1,、2) 是 score[0][0]=1、score[1][0]=4、score[2][0]=7,當 i=1 時,印出順序是 score[0][1]=2、score[1][1]=5、score[2][1]=8,當 i=2 時,印出順序是 score[0][2]=3、score[1][2]=6、score[2][2]=9。 (C) 程式範例
7-3-5 自我挑戰:列印直式唐詩 (A)程式功能:PM7_5.java 請製作一套唐詩列印系統,功能是能將所將輸入的唐詩(五言四句),分別以橫式與直式印出。期望操作介面如下:
(B)製作技巧提示: 本系統需要二維陣列(poem[][];),將詩句裡每一個文字儲存於陣列的元素裡,才可分別以橫式或直式印出。其中包含兩困難點,一者是如何將一串文字輸入,分別取出每一個文字,再存入陣列元素內;另一者是如何轉換陣列的行與列印出(直式列印)。前者,吾人將一串文字直接讀入系統並存放某字串變數(data)內(利用 Scanner 物件),再將該變數宣告成掃瞄物件(Scanner 物件)並指定分隔符號為沒有空格(useDelimiter("")),接著即可掃瞄取出每一個文字,再分別存入陣列內,如圖 7-4 所示。
圖 7-8 poem[][] 陣列儲存內容 唐詩內所有文字都依序存入陣列後。原先是依照一行接一行填入文字,如果一行接一行印出,則如同輸入格式一樣是橫式輸出;如果將行與列倒過來印,則是直式輸出。虛擬碼提示如下: 虛擬碼提示如下:
|
翻轉工作室:粘添壽
Java 程式設計(一) 含程式邏輯
翻轉電子書系列:
|