1 / 43

Ch07 陣列

Ch07 陣列. JAVA 程式設計入門 (I). 大綱. 一維陣列 二維陣列 多維陣列. 何謂陣列. 生活上的例子:一汽車旅館有六間房間,某天住宿的情形. 我們可以記錄成 :. 以陣列表示成:. 0號房間有3個房客 1號房間有2個房客 2號房間有2個房客 3號房間有0個房客 4號房間有4個房客 5號房間有1個房客. 何謂陣列. 陣列-「 多個擁有相同名稱且同型別的變數集合 」 陣列是一段連續的區域,裡面由數個相同型別的陣列元素組成 陣列元素有相同的名稱,為了區別每個陣列元素,它們有各自的位置編號

kohana
Download Presentation

Ch07 陣列

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Ch07 陣列 JAVA程式設計入門(I)

  2. 大綱 • 一維陣列 • 二維陣列 • 多維陣列

  3. 何謂陣列 生活上的例子:一汽車旅館有六間房間,某天住宿的情形 我們可以記錄成: 以陣列表示成: 0號房間有3個房客 1號房間有2個房客 2號房間有2個房客 3號房間有0個房客 4號房間有4個房客 5號房間有1個房客

  4. 何謂陣列 • 陣列-「多個擁有相同名稱且同型別的變數集合」 • 陣列是一段連續的區域,裡面由數個相同型別的陣列元素組成 • 陣列元素有相同的名稱,為了區別每個陣列元素,它們有各自的位置編號 • 陣列元素以陣列名稱,後接一對中括弧“[]”,中括弧內放入位置編號。 • 位置編號一般也稱為索引,索引一律由0開始,接著是1、2、3…至元素個數減一。 • 陣列的索引必須是大於或等於0的整數,或結果為整數的運算式。

  5. 陣列的宣告與配置(I) • 陣列的宣告方式: 資料型別 陣列名稱[]; 資料型別 [] 陣列名稱; • 同時宣告兩個int型別 int[] arr1, arr2; • 配置陣列:(陣列初始化) 陣列名稱 = new資料型別[元素個數]; • 宣告與配置陣列的方法一: char cArr[]; cArr = new char[3];

  6. 陣列的宣告與配置(II) • 宣告並配置: 資料型別 陣列名稱[] = new 資料型別[元素個數]; • 宣告與配置一陣列的方法二: char cArr[] = new char[3];

  7. 陣列的宣告與配置 • 陣列變數其實是一種參照變數(reference variable) • 陣列名稱是指向陣列實體的一個參照變數 • JVM中陣列的宣告與配置

  8. 使用陣列元素 • 使用陣列元素的語法: • 使用陣列的敘述: • 取得陣列的長度 陣列名稱[索引] int iArr[] = new int[3]; //宣告並配置陣列 iArr[1] = 123; //設定第2個元素值為123 iArr[2] = 456; //設定第3個元素值為456 //將第2和第3個元素值相加後設定給第1個元素 iArr[0] = iArr[1] + iArr[2]; 陣列名稱.length

  9. 使用陣列元素 • 元素預設值 • 陣列在配置後,元素的內容就會被填入預設值。 • 陣列的基底型態為整數者預設值為0。 • 浮點數則為0.0f或0.0d。 • boolean型別為false。 • 物件為null。

  10. 範例1:Ch06_01.java:以迴圈設值並列出 • int[] a = new int[5]; • for(int i=0; i<a.length; i++) • a[i] = a.length-i; • for(int i=0; i<a.length; i++) • System.out.println("a[" + i + "]=" + a[i]);

  11. 以大括號配置陣列並設值 法一:資料型別 陣列名稱[] = new 資料型別[] {元素值1, 元素2,..., 元素值N}; 法二:資料型別 陣列名稱[] = {元素值1,元素值2,...,元素值N}; • 宣告並設定陣列內容 例子: • 宣告並設定初值時,勿在中括號內填入元素的個數 • 已宣告的陣列不可以使用大括號配置陣列及設值 int myArray[] = new int[] {10, 20, 30, 40, 50, 60}; int myArray[] = {10, 20, 30, 40, 50, 60}; int myArray[3] = {1, 2, 3}; // 錯誤 int myArray[]; myArray = {1, 2, 3}; //錯誤

  12. 範例2:Ch06_02.java:以大括號設值與陣列預設值 • int[] a = {10, 20, 30, 40, 50, 60}; • int[] b = new int[3]; • for(int i=0; i<a.length; i++) • System.out.print("a[" + i + "]=" + a[i] +"\t"); • System.out.print("\n"); • for(int i=0; i<b.length; i++) • System.out.print("b[" + i + "]=" + b[i] +"\t");

  13. 索引勿超出範圍 • 索引超出範圍時,編譯的過程不會有錯誤訊息 • 執行時會發生例外訊息(ArrayIndexOutOfBoundsException)。 • 可以加上if來過濾索引是否超出範圍,避免發生例外訊息 if(ch<0 || ch>=xmen.length) { System.out.println("超出範圍了,請重來!"); System.exit(0); }

  14. 範例3:Ch06_03.java: 測試若索引值超出合法範圍 • if(args.length<1) • { • System.out.println("請傳入參數以選擇你最喜歡的 Xmen"); • System.out.println("0)超人 1)閃電俠 2)蜘蛛人 3)金剛狼"); • System.exit(0); //離開程式 • } • String[] xmen = {"超人", "閃電俠", "蜘蛛人", "金剛狼"}; • int ch = Integer.parseInt(args[0]); //將第一個參數轉換成整數 • System.out.println("你選擇的是: "+xmen[ch]);

  15. 例外訊息

  16. 練習一 修正範例3的程式, 使其在輸入值為4或更大的值時, 會出現警告訊息,而非例外訊息

  17. 練習二 Int a[] = {36, 41, 24, 17} Int b[] = {9, 34, 26, 49} 比較兩陣列中相對應位置元素的值,並將值較大者存放到陣列a中,較小者存到b,列出兩陣列中的值

  18. 練習三 求long型別的最大值9223372036854775807的平方 (利用int陣列,一個元素代表一個位數)

  19. 陣列的=運算 基本型別使用指定運算子時,會將變數的值存入另一個變數的記憶位址。 指定運算子使用在陣列或物件時,與「以值指定」使用相同的機制,不過其值不是一般的基本型別常數,而是參照(Reference) int a = 5, b; b = a; //將a設定給b,a為5,b為5 b = 6; //將6設定給b,a為5,b為6 int[] arr1 = {16, 17, 18}; //宣告配置arr1並設值 int[] arr2; //宣告arr2陣列 arr2 = arr1; //arr1參照指定給arr2 19

  20. 陣列的=運算 兩個陣列名稱指向相同的陣列實體 20

  21. 陣列的=運算 兩個陣列的基底型別不同時,參照不可相互指定 int[] arr1 = {16, 17, 18}; long[] arr3 = arr1; //錯誤 21

  22. 範例4:Ch06_04.java 陣列指向相同的陣列實體 int[] a1 = {16, 17, 18}; int[] a2; int[] a3 = {16, 17, 18}; a2 = a1; System.out.println("a1的參照:" + a1); System.out.println("a2的參照:" + a2); System.out.println("a3的參照:" + a3); a2[1] = 32; System.out.println("a1的值:"+a1[0]+","+a1[1]+","+a1[2]); System.out.println("a2的值:"+a2[0]+","+a2[1]+","+a2[2]); System.out.println("a3的值:"+a3[0]+","+a3[1]+","+a3[2]); 22

  23. 範例4:Ch06_04.java結果 23

  24. 陣列複製 兩個陣列名稱有相同的元素內容,但使用不同的陣列實體,而不是指定參照的方式 使用System.arraycopy方法 來源陣列:欲複製的陣列 來源起始索引:來源陣列中所欲複製的陣列片段起始索引值 目的陣列:存放複製內容的陣列 目的起始索引:目的陣列中存放複製內容的起始位置 陣列長度:陣列中所欲複製的長度(元素個數) System.arraycopy(來源陣列, 來源起始索引, 目的陣列, 目的起始索引, 陣列長度); 24

  25. 陣列複製 使用System.arraycopy的例子 沒有配置空間的陣列,只能指定參考,不能用System.arraycopy複製陣列。 int[] a1 = {10, 20, 30, 40, 50}; int[] a2 = new int[a1.length]; System.arraycopy(a1, 0, a2, 0, a1.length); 25

  26. 範例1:Ch06_05.java:複製陣列 int[] a1 = {10, 20, 30, 40, 50}; int[] a2 = new int[a1.length]; System.arraycopy(a1, 0, a2, 0, a1.length); int[] a3 = new int[a1.length]; System.arraycopy(a1, 2, a3, 0, 3); a2[1] = -1; for(int i=0; i<a1.length; i++) { System.out.print("a1["+i+"]="+a1[i]+"\t"); System.out.print("a2["+i+"]="+a2[i]+"\t"); System.out.println("a3["+i+"]="+a3[i]); } 26

  27. 範例1:Ch06_05.java結果 27

  28. 練習一 不使用直接呼叫System.arraycopy方法,設計一個程式,可以將陣列做複製(非指定參考)。

  29. 二維陣列 二維陣列可以想成有好幾列的房間 29

  30. 二維陣列的宣告與配置 宣告二維陣列的語法 配置陣列: 宣告並配置的例子: 資料型別 陣列名稱[][ ]; 資料型別[]陣列名稱[ ]; 資料型別[][ ]陣列名稱; 陣列名稱 = new資料型別[列數][行數]; int[][] arr = new int[3][5]; 30

  31. 使用元素 元素的表示法: int[][] a = new int[3][4]; 31

  32. JVM中的二維陣列 • 建立陣列實體,再指定給參照變數 32

  33. 範例2:Ch06_06.java使用二維陣列 int[][] a = new int[3][4]; for(int i=0; i<a.length; i++) for(int j=0; j<a[i].length; j++)    a[i][j] = i*10 + j; for(int i=0; i<a.length; i++) {    for(int j=0; j<a[i].length; j++) System.out.print("a["+i+"]["+j+"]="+a[i][j]+"\t"); System.out.print("\n"); } System.out.println("\na=\t" +a); System.out.println("a[0]=\t"+a[0]); System.out.println("a[1]=\t"+a[1]); System.out.println("a[2]=\t"+a[2]); 33

  34. 範例2:Ch06_06.java結果 34

  35. 使用大括號建立二維陣列 非矩形二維陣列 int[][] a = {{1, 3, 5}, {2, 4}, {9, 8, 7, 6}}; 35

  36. 使用大括號建立二維陣列 若某列只有一個元素時,同樣必須以大括號包起來 int[][] a = {{1, 3, 5}, {2, 4}, {9}}; int[][] a = {{1, 3, 5}, {2, 4}, 9}; //錯誤 36

  37. 範例3:Ch06_07.java使用非矩形的二維陣列 int[][] a = {{1, 3, 5}, {2, 4}, {9, 8, 7, 6}}; int b[][] = new int[3][]; b[0] = a[2]; b[1] = new int[2]; b[2] = new int[3]; 37

  38. 範例3:Ch06_07.java使用非矩形的二維陣列 int[][] a = {{1, 3, 5}, {2, 4}, {9, 8, 7, 6}}; int b[][] = new int[3][]; b[0] = a[2]; b[1] = new int[2]; b[2] = new int[3]; b[0][0] = 10; for(int i=0; i<a.length; i++) { for(int j=0; j<a[i].length; j++)  System.out.print("a["+i+"]["+j+"]="+a[i][j]+"\t"); System.out.print("\n"); } System.out.print("\n"); for(int i=0; i<b.length; i++) { for(int j=0; j<b[i].length; j++) System.out.print("b["+i+"]["+j+"]="+b[i][j]+"\t"); System.out.print("\n"); } 38

  39. 範例3:Ch06_07.java結果 39

  40. 多維陣列 N維陣列的宣告 配置陣列: 使用元素 建立三維陣列的例子: 資料型別 陣列名稱[][]…[]; 資料型別[][]…[]陣列名稱; 陣列名稱 = new 資料型別[個數1][個數2]…[個數N]; 陣列名稱[索引1][索引2]…[索引N] int[][][]ar = new int[3][4][5]; int[]b[][] = {{{9}}}; 40

  41. 練習二 陣列a={12, 23, 34, 45, 56, 67} 陣列b={1, 2, 3, 4, 5, 6} 將b的元素值加到陣列a後面,即 陣列a={12, 23, 34, 45, 56, 67, 1, 2, 3, 4, 5, 6} 41

  42. 練習三 宣告並配置5*4的二維陣列aa,並使用迴圈設值如下: 42

  43. 練習四 修改上一題的程式,宣告並配置4*5的二維陣列bb使用迴圈將陣列aa的元素設定給陣列bb,陣列bb的值為 43

More Related