Java 程式設計(一)  第 七章 陣列  上一頁    下一頁

 

7-3 二維陣列處理

內容:

  • 7-3-1 二維陣列宣告

  • 7-3-2 範例研討:印出二維陣列內容

  • 7-3-3 自我挑戰:二維陣列內容加倍

  • 7-3-4 範例研討:印出二維轉陣列

  • 5-3-5 自我挑戰:列印直式唐詩

既然陣列是由若干個相同資料型態的變數整合而成,變數的排列格式也延伸了不同的陣列格式。如果所有變數排列成一行或一列,則稱之為『一維陣列』(如 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 二維陣列的結構

二維陣列宣告語法:

 範例:

Data_type Array_name[][];

Array_name = new Data_type[num1][num2];

Data_type[][] name = new Data_type[num1][num2];

int score[];

score = int[20][10];

int[][] score = new int [20][10];

Data_type Array_name[] []= { …};

int score[][] = {{1, 2, 3},

{4, 5, 6},

{7, 8, 9},

{10, 11, 12}};

第一行語法是宣告產生二維陣列,第二行則再給予初值。如敘述句如: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}} 內容並依照相對位置排列(平面形狀)。 期望操作介面如下:

D:\Java2_book\chap3>javac Ex3_1.java

 

D:\Java2_book\chap3>java Ex3_1

         1       2       3

         4       5       6

         7       8       8

        10      11      12

B)製作技巧研討:

吾人利用 x y 變數作為陣列位置索引,x 是行數指標,y 為列數指標,則任何一元素可由 score[x][y] 表示。如欲平面型態印出陣列內容,則需要二重迴圈敘述,外迴圈標示共計列印幾行(x = 0, 1, …, score.length);內迴圈索引每行的列數(y = 0, 1, 2, …, score[x].length)。

C)程式範例:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

//Ex7_2.java

 

public class Ex7_2 {

    public static void main(String args[]) {

        int score[][]={{1, 2, 3},

                   {4, 5, 6},

                   {7, 8, 8},

                   {10, 11, 12}};

        int x;                    // 行指標 (外迴圈)

        int y;                    // 列指標 (內迴圈)

        for(x=0; x<score.length; x++) {

             for(y=0; y<score[x].length; y++)

                 System.out.printf("\t%2d", score[x][y]);

             System.out.printf("\n");

        }

    }

}

(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 倍,再依照相對位置排列(平面形狀)。 期望操作介面如下:

D:\Java2_book\chap3>java Ex3_2

原陣列內容:

         1       2       3

         4       5       6

         7       8       8

        10      11      12

加倍後陣列內容:

         2       4       6

         8      10      12

        14      16      16

        20      22      24

B)製作技巧提示:

我們建構一個比較容易擴充的程式,將 score[][] 宣告成類別變數,使其允許類別內所有方法使用,又將列印陣列的功能製作成一個獨立的 disp_arr() 方法,程式架構如圖 3-2 所示。

(C) 程式片段

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

//Ex3_2.java

public class Ex3_2 {

  /*宣告類別變數 score[] */

  static int score[][]={{1, 2, 3},

                        {4, 5, 6},

                        {7, 8, 8},

                        {10, 11, 12}};

  /* 主程式 main() */

  public static void main(String args[]) {

      System.out.printf("原陣列內容:\n");                   

      disp_Arr();

      for(int x=0; x<score.length; x++) {         // 行指標 (外迴圈)

           for(int y=0; y<score[x].length; y++)   // 列指標 (內迴圈)

               score[x][y] = score[x][y] * 2;

      }

      System.out.printf("加倍後陣列內容:\n");

      disp_Arr();

  }

 

  /* 列印陣列方法 disp_arr()  */

  static void disp_Arr() {

      for(int x=0; x<score.length; x++) {

           for(int y=0; y<score[x].length; y++)

               System.out.printf("\t%2d", score[x][y]);

      System.out.printf("\n");

      }

  }

}

7-3-4 範例研討:印出二維陣列的轉陣列(S-T

A)程式功能:Ex7_5.java

請編寫一程式,請將陣列 score [][] = {{1, 2, 3}, {4, 5, 6},{7, 8, 9}, {10, 11, 12}} 轉移(S-T),再依照相對位置排列(平面形狀)。 期望操作介面如下:

D:\Java1_book\chap7>java Ex7_5

列印原陣列如下:

         1       2       3

         4       5       6

         7       8       9

 

列印轉移陣列如下:

         1       4       7

         2       5       8

         3       6       9

(B) 製作技巧

我們只要將由陣列內容取出的次序轉換就可以,原陣列取出是 score[i][j],轉移陣列取出是次序是 score[j][i]。當外迴圈 i=0 時,印出順序 (j=01,2) score[0][0]=1score[1][0]=4score[2][0]=7,當 i=1 時,印出順序是 score[0][1]=2score[1][1]=5score[2][1]=8,當 i=2 時,印出順序是 score[0][2]=3score[1][2]=6score[2][2]=9

(C) 程式範例

01

02

03

04

05

06

07

08

09

10

11

12

public class Ex7_5{

        public static void main(String args[]) {

                int score[][] = {{1, 2, 3},

                                        {4, 5, 6},

                          7, 8, 9}};

                                               

                System.out.printf("列印原陣列如下:\n");

                for(int i=0; i<score.length; i++){

                        for(int j=0; j<score[i].length; j++)

                                System.out.printf("\t%2d", score[i][j]);

                        System.out.printf("\n");

                }

                System.out.printf("\n列印轉移陣列如下:\n");

                for(int i=0; i<score.length; i++){

                        for(int j=0; j<score[i].length; j++)

                                System.out.printf("\t%2d", score[j][i]);

                        System.out.printf("\n");

                }

        }

}

7-3-5 自我挑戰:列印直式唐詩

A)程式功能:PM7_5.java

請製作一套唐詩列印系統,功能是能將所將輸入的唐詩(五言四句),分別以橫式與直式印出。期望操作介面如下:

G:\Examples\chap7>java PM7_5

== 五言四句唐詩 列印 ==

請輸入第 1 (五個字) =>山中相送罷

請輸入第 2 (五個字) =>日幕掩柒扉

請輸入第 3 (五個字) =>春草明年綠

請輸入第 4 (五個字) =>王孫歸不歸

 

== 橫式列印唐詩 ==

       

       

       

       

 

== 直式列印唐詩 ==

     

     

     

     

     

B)製作技巧提示:

本系統需要二維陣列(poem[][];),將詩句裡每一個文字儲存於陣列的元素裡,才可分別以橫式或直式印出。其中包含兩困難點,一者是如何將一串文字輸入,分別取出每一個文字,再存入陣列元素內;另一者是如何轉換陣列的行與列印出(直式列印)。前者,吾人將一串文字直接讀入系統並存放某字串變數(data)內(利用 Scanner 物件),再將該變數宣告成掃瞄物件(Scanner 物件)並指定分隔符號為沒有空格(useDelimiter("")),接著即可掃瞄取出每一個文字,再分別存入陣列內,如圖 7-4 所示。

7-8 poem[][] 陣列儲存內容

唐詩內所有文字都依序存入陣列後。原先是依照一行接一行填入文字,如果一行接一行印出,則如同輸入格式一樣是橫式輸出;如果將行與列倒過來印,則是直式輸出。虛擬碼提示如下:

虛擬碼提示如下:

導入相關套件(java.util.Scanner);

宣告唐詩陣列(String[][] poem = new String[4][5]);

讀入五言四句唐詩:

        for(int i=0; i<4; i++) {

             System.out.printf("請輸入第 %d (五個字) =>", i+1);

             data = keyin.next();

             Scanner s = new Scanner(data).useDelimiter("");

             for(int j=0; j<5; j++)       // 分別讀取詩句中每一個文字

                poem[i][j] = s.next();

        }

列印橫式唐詩:

        for(int i=0; i<4; i++) {           // 列印 4

            for(int j=0; j<5; j++)        // 每行 5 個字

                System.out.printf("%s  ", poem[i][j]);

            System.out.printf("\n");

        }

列印直式唐詩:

        for(int j=0; j<5; j++) {            // 列印 5

            for(int i=0; i<4; i++)         // 每行 4 個字

                System.out.printf("%s  ", poem[i][j]);

            System.out.printf("\n");

        }

翻轉工作室:粘添壽

 

Java 程式設計(一) 含程式邏輯

 

 

翻轉電子書系列: