740 likes | 1.02k Views
a[0]. a[1]. a[2]. 記憶體. a[3]. 0. 4 bytes. a[4]. 2. 4. 陣列名稱. 陣列索引. 陣列的值. 6. 8. 陣列 (array). 定義 一組有相同的變數名稱和資料型別的連續記憶體位置 用途 處理大量 相同型態 的資料時使用 優點 避免使用大量的變數名稱 存取快速而且容易. 陣列用來集合一群相同型態變數的資料型態. int v_herry = 95; int v_devid = 88; int v_jack = 65; int v_mike = 92;
E N D
a[0] a[1] a[2] 記憶體 a[3] 0 4 bytes a[4] 2 4 陣列名稱 陣列索引 陣列的值 6 8 陣列(array) • 定義 • 一組有相同的變數名稱和資料型別的連續記憶體位置 • 用途 • 處理大量相同型態的資料時使用 • 優點 • 避免使用大量的變數名稱 • 存取快速而且容易
陣列用來集合一群相同型態變數的資料型態 int v_herry = 95; int v_devid = 88; int v_jack = 65; int v_mike = 92; int v_stephen = 75; int v_dennis = 60; int v_john = 66; int v_steven = 90; int v_ben = 79; int v_paul = 80; int[ ] score= new int[10]; score[0] = 95; score[1] = 88; score[2] = 65; score[3] = 92; score[4] = 75; score[5] = 60; score[6] = 66; score[7] = 90; score[8] = 79; score[9] = 80;
陣列介紹 • 定義: • 一群相同資料型態變數的集合 • 特色 • 它不屬於 “基本型態” (Primitive),故宣告之後 Java 並不會自動為該變數產生實體,您必須自行用 new 指令產生實體。
陣列的宣告 • Java 不允許在宣告 array 時,就描述空白 array 的大小,必須利用new operator 顯性地設定 array 大小,例如: int intArray[ ] ; char charArray[ ] ; float floatArray[ ] ; • 也可把方括號擺在 data type 之後,而不是在 variable name 之後。諸如: int[ ] intArray ; char[ ] charArray ; float[ ] floatArray ; • 在完成宣告之後,使用 new 來為 array 配置記憶體,緊接在 new 的後面就是 array 所含元素的 data type,而在 data type 之後就是一對方括號,且方括號內的數目就是描述 array 的元素個數。例如, intArray = new int[5] ; //an array of 5 integers
記憶體 0 4 bytes 0 0 0 a[0] a[0] 0 a[1] a[1] a[2] a[2] 記憶體 a[3] a[3] 0 4 bytes a[4] a[4] 2 4 6 8 一維陣列的宣告 • 宣告(1):僅宣告陣列的型態與大小 或 宣告(2):宣告並設定初始值
一維陣列的宣告(續) • 宣告(3): 同時宣告多個陣列 或
記憶體 1 4 bytes 2 3 4 5 a[0] a[1] a[2] a[3] a[4] 陣列的存取 • 存取 • 使用 length命令可以顯示陣列元素的個數
陣列是參考型別的資料類型 • 參考型別變數的記憶體圖 int[] a = new int[50];
使用「length」取得陣列的長度 • 我們可以使用「length」來取得某一陣列的長度,例如: a.length //取得a陣列的長度值 • 利用迴圈處理陣列時,常會使用到「length」屬性。例如: for (i=0; i<a.length; i++) { System.out.println(a[i]); }
取得陣列長度 • 一維陣列 • 陣列名稱.length • int[] intArray = {3, 5, 2, 6, 4};intArray.length 5 • 二維陣列 • 無法取得整個二維陣列長度;只能取得各列長度。 • 陣列名稱[index].length • int[][] intArray = {{1}, {2, 3, 5}, {4, 8}};intArray[0].length 1intArray[1].length 3intArray[2].length 2
作業:已知整數陣列 a 有六個元素,其值分別為 25、36、47、 32、21、16,請設計一個程式求它的最小值、最大值、總和及平均。
字元陣列設定初始值 • 以下的程式碼可以宣告一維字元陣列: char ch1[]=new char[10]; • 字元陣列 ch1 中共可以存放 10個字元 • 設定陣列 ch1 中的值可以如: • ch1[i]=65; //字母A的ASCII碼 • ch1[i]= ’A’; • 也可以利用下列方式設定初始值: • char ch1[]={‘A’,‘B’,‘C’,‘D’,‘E’,‘F’,‘G’,‘H’,‘I‘,’J’};或ch1[]={65,66,67,68,69,70,71,72,73,74};
記憶體 A(0,0) A(0,1) A(0,2) A(0,3) A(1,0) A(1,1) A(1,2) A(1,3) A(2,0) A(2,1) A(2,2) A(2,3) 二維陣列在記憶體中 的實際排列順序 二維陣列宣告 4 3 宣告並設定初值
作業: 設 a、b、c 均為 3 列 3 行的矩陣 , 已知 a={{1,2,3},{4,5,6},{7,8,9}}、b={{10,9,8},{7,6,5},{4,3,2}},求 c=a+b。
陣列的使用 • 使用二維陣列來計算全班平均成績: 三年甲班第一次月考的國文和英文成績表如下:
成績陣列的宣告方式 • 陣列宣告方式: float score[ ][ ] = { {1,90,95}, {2,85,92}, {3,75,88}, {4,88,79}, {5,95,90}, {6,92,82}, {7,80,83}, {8,90,67}, {9,95,79}, {10,92,94} }; • 這種宣告方式,座號1同學的國文和英文成績資料,分別存放在元素score[0][1]和score[0][2],座號2同學的資料存放在元素score[1][1]和score[1][2]。
完整程式碼: public class a5_01_03b { float score[][]={ {1,90,95},{2,85,92},{3,75,88}, {4,88,79},{5,95,90},{6,92,82}, {7,80,83},{8,90,67},{9,95,79},{10,92,94} }; float total_chi=0.0f, total_eng=0.0f ,avg_chi=0.0f, avg_eng=0.0f; public a5_01_03b() {} public void process() { for(int i=0;i<score.length;i++) { total_chi=total_chi+score[i][1]; //加總國文成績 total_eng=total_eng+score[i][2]; //加總英文成績 } avg_chi=total_chi/score.length; avg_eng=total_eng/score.length; } public void output() { System.out.println("全班國文平均成績:"+avg_chi); System.out.println("全班英文平均成績:"+avg_eng); } public static void main(String args[]) { a5_01_03b a=new a5_01_03b(); a.process(); a.output(); } }
習題 • 習題 • (Score1)某次段考有五個學生成績如下表, 試計算每個學生的總分, 以及各科全班平均分數 執行結果:
[0][0] [0][1] [0][2] [1][0] [1][1] [2][0] [2][1] [2][2] [2][3] 不規則陣列 • 定義 • 陣列的每一橫列擁有不同長度的元素 • Java 使用 “陣列的陣列” 來達成此功能 • 範例如下 public class NonRectangular { public static void main(String[] args) { int[][] as = { {11, 12, 13}, {21, 22}, {31, 32, 33, 34} }; System.out.println("Element [1][1]: " + as[1][1]); } }
二維字元陣列 • 宣告二維字元陣列的方法,與宣告二維數值陣列同: • char chr1[ ][ ]=new char[3] [20]; • 二維字元陣列也可以當作一維字串陣列來使用 public class a5_02_02 { public static void main(String args[]) { char chr1[ ][ ]={ {'A','B','C','D','E','F'}, {'G','H','I'}, {'J','K','L','M','N','O','P‘} }; System.out.println(chr1[0]); System.out.println(chr1[1]); System.out.println(chr1[2]); System.out.println(chr1[0].length); System.out.println(chr1[1].length); System.out.println(chr1[2].length); } }
2 1,0,0 1,0,1 1,0,2 1,0,3 1,0,3 0,0,0 0,0,1 0,0,2 0,0,3 1,1,3 0,0,0 0,0,1 0,0,2 0,0,3 1,2,3 0,1,0 0,1,1 0,1,2 0,1,3 3 0,2,0 0,2,1 0,2,2 0,2,3 4 多維陣列 • 三維陣列 • 宣告 記憶體 0,0,0 0,0,1 1,0,0 0,0,2 1,0,1 0,0,3 1,0,2 0,1,0 1,0,3 0,1,1 1,1,0 0,1,2 1,1,1 0,1,3 1,1,2 0,2,0 1,1,3 0,2,1 1,2,0 0,2,2 1,2,1 0,2,3 1,2,2 1,2,3 三維陣列在記憶體中 的實際排列順序
隨機 • 隨機函數random()會自動產生一個大於等於0,且小於1的亂數(隨機數),例如: x= Math.random(); • 將這個隨機函數應用在不同的程式中,就可以產生不同的隨機效果。 • 產生0<= x < 100 的一個亂數: int x=(int)(Math.random()*100); • 產生100以內,且為5的倍數的隨機數: int x=(int)((Math.random()*20)*5; • 產生大於等於80且小於100,必須為2的倍數的隨機數: int x=(int)(Math.random()*10)*2+80;
String 類別中常用的字串物件建構子。 • public String() • public String(String str) • public String(char c[]) • public String(char c[], int offset, int length) • public String(byte bytes[]) EX: byte[] value = “學習JAVA”.getBytes(); String str1 = new String(value); • public String(byte bytes[], int offset, int length) • public String(StringBuffer buffer)
已定字初始定義String物件 • 字串建構的範例 String str1 = "這是一組字串"; String str2 = str1; String str3 = new String("這是一組字串"); String str4 = new String("這是一組字串"); String str5 = “”; ///建構一個空字串
String 建構子。 public class Constructor { public static void main( String args[] ) { char ca[] = { 'g', 'o', 'o', 'd', '-', 'b', 'y' }; byte ba[] ={(byte)'h',(byte)'a',(byte)'p',(byte)'p',(byte)'y' }; String s = new String("Hello!"); StringBuffer sb = new StringBuffer("如何設計JAVA程式"); String s1 = new String(); String s2 = new String(s); String s3 = new String(ca); String s4 = new String(ca, 5, 2); String s5 = new String(ba); String s6 = new String(sb); System.out.println( " s1= " + s1 ); System.out.println( " s2= " + s2 ); System.out.println( " s3= " + s3 ); System.out.println( " s4= " + s4 ); System.out.println( " s5= " + s5 ); System.out.println( " s6= " + s6 ); } }
二維字串陣列: • 宣告String型態的二維陣列,命令如下: • String str1[ ][ ]=new String[3] [2]; • 或直接指定字串內容如下: String str1[ ][ ]= { {“網奕數位科技”, “www.habook.com.tw”}, {“松博學習科技”, “www.aclass.com.tw”}, {“知城數位科技”, “www.acore.com.tw”} }; • 前述二維字串陣列中,str1[0][0]的字串內容為 “網奕數位科技”,str1[0][1]的字串內容為 “www.habook.com.tw”。
字元陣列轉換為字串1: • 例如: char ch1[]={'A','B','C','D','E','F','G','H','I‘,’J’}; String str2=new String(ch1); • 則字串str2的內容如下: str2 = “ABCDEFGHIJ”; • 也可以使用 copyValueOf()命令將字元陣列轉換為字串: • String str2=String.copyValueOf(ch1)
字元陣列轉換為字串2: • 傳入一個char陣列,並指定元素的內容 • 使用char陣列來初始String物件的內容時,不一定要將char陣列中的所有元素都當做是String物件的初始內容,例如:傳入char陣列,並指定元素值範圍的宣告方式為: String 字串名稱 = new String(char[] value, int offset, int count); • 「offset」用來指定char陣列的開始位置的索引值,而「count」則是指定需要取用的元素個數。以下的範例程式示範如何使用char陣列來將String物件的內容初始為「JAVA」: char[] value = new char[] {'學', '習', 'J', 'A', 'V', 'A'}; String str1 = new String(value, 2, 4);
取得 String 物件內含之 char[] 值,如: Str3 = "This is Str3"; char[ ] c1 = Str3.toCharArray();
字串轉換為字元陣列: public class a5_02_04 { public static void main(String args[]) { String str1[]={"JavaScript", "Flash MX", "C++Builder 6", "Visual Basic 6", "Java2", "Director 8"}; char[] book1=str1[0].toCharArray(); //將字串元素str1[0]轉換為字元陣列 char[] book2=str1[1].toCharArray(); //將字串元素str1[1]轉換為字元陣列 char[] book3=str1[2].toCharArray(); //將字串元素str1[2]轉換為字元陣列 char[] book4=str1[3].toCharArray(); //將字串元素str1[3]轉換為字元陣列 char[] book5=str1[4].toCharArray(); //將字串元素str1[4]轉換為字元陣列 char[] book6=str1[5].toCharArray(); //將字串元素str1[5]轉換為字元陣列 System.out.println(book1); // 顯示字元陣列元素book1[0] System.out.println(book1[0] ); // 顯示字元陣列元素book2[0] System.out.println(book2[0]); // 顯示字元陣列元素book3[0] System.out.println(book4[0]); // 顯示字元陣列元素book4[0] System.out.println(book5[0]); // 顯示字元陣列元素book5[0] System.out.println(book6[0]); // 顯示字元陣列元素book6[0] } } • 在前面曾經介紹將 “字元陣列轉換為字串”,相反的,我們也可以使用 toCharArray命令將“字串資料轉換為字元陣列” 。
使用「=」運算子不能複製陣列的內容 • 使用「參考型別」的資料類型時,如果將某一個「參考型別」的變數a的內容「指定 (=) 」給另一個「參考型別」的變數b時,這僅是代表兩個變數指向同一塊記憶體空間,而不是將一個物件的內容複製給另一個物件。 請參考次一頁的圖形:
使用「=」運算子複製陣列內容?... int[] FirstArray = {1, 2, 3, 4}; int[] SecondArray; SecondArray = FirstArray;
使用「clone」複製陣列物件 • 我們可以延用該類別中的「clone()」方法來達成複製陣列的目的。該方法會產生並傳回某個物件的副本。 SecondArray = FirstArray.clone();
將舊陣列資料複製到新陣列中 語法: 新陣列資料型態[] 新陣列名稱 = (新陣列資料型態[]) 舊陣列名稱.clone(); 範例: class Sample5_11 { public static void main(String[] args) { int[] i ={9,5,4,8}; int[] j =i.clone();//將 i 陣列複製給 j 陣列 } } 回參考資料型態
使用「arraycopy()」複製陣列內容 • 除了使用「Object」類別的「clone()」方法複製陣列之外,我們還可以使用「java.lang.System」類別下的「arraycopy()」方法來複製陣列,語法如下: arraycopy(Object src, int srcPos, Object dest, int destPos, int length) • 「src」代表需要複製的來源陣列; • 「srcPos」代表來源陣列的開始索引值; • 「dest」代表要目的陣列; • 「destPos」代表目的陣列的開始索引值; • 「length」代表需要複製的資料長度 • 使用範例如同: • System.arraycopy(FirstArray, 2, SecondArray, 1, 2);
使用「arraycopy()」應注意事項 • 利用「arraycopy()」方法,可以將陣列中的某些,或是全部的元素複製到另一個陣列的任何位置中。 • 但使用時,您必需考慮到目的陣列的大小是否能容納原始陣列中需要被複製的元素個數。而您也必需要考慮來源陣列可取得的元素個數是否小於「length」的值 • 「ArrayIndexOutOfBoundsException」和 「ArrayStoreException」例外 • 「arraycopy」只能將來源陣列的內容複製到目的陣列中,它並不會為目的陣列配置記憶體空間。
比較陣列 語法: java.util.Arrays.equals(陣列1,陣列2); 說明:陣列1與陣列2比較,若資料相同,則傳回 true,否則傳回false。 範例: class Sample5_12 { public static void main(String[] args) { int[] i = {9,5,4,8}; int[] j = i.clone(); if (java.util.Arrays.equals(i,j)) System.out.println("i與j兩個陣列相同!!"); else System.out.println("i與j兩個陣列不相同!!"); } } 回參考資料型態
使用Array和Arrays類別 • Java中提供了「Array」類別來協助陣列的相關問題。Array類別並沒有提供建構子,但Array類別中提供了相當多的方法可以用來設定或取得陣列的內容。 • Array類別中提供的「get(Object array, int index)」方法可用來取出陣列中特定索引值的元素內容。 • Array類別中也提供的「set(Object array, int index)」方法可用來設定陣列中特定索引值的元素內容。
使用Array和Arrays類別… • 另一個更有用的類別是「Arrays」類別來協助陣列的相關問題。Arrays類別也沒有提供建構子,但Arrays類別中提供了相當多的方法可以用來簡化陣列的操作,該類別是屬於「java.util」套件,使用前,您必需先引入該套件。語法如下: import java.util.*;
判斷陣列的內容是否相同 • 陣列是一種物件,您不能使用指定運算子「=」。如果您使用邏輯運算子「==」,則是判斷兩個變數是否指向同一個陣列,而不是判斷兩個陣列的內容是否相同。 • Arrays類別中提供了自已的equals方法來判斷兩個陣列的內容是否相同。該方法是屬於類別方法。使用的語法如下: Arrays.equals(陣列A, 陣列B) • 該類別是屬於「java.util」套件,使用前,您必需先引入該套件。語法如下: import java.util.*;
對陣列做遞增排序 語法: java.util.Arrays.sort(要排序的陣列); 說明: 對要排序的陣列做遞增排序 範例: class sort { int[ ] i = {9,5,14,8,45,21,10}; public sort() {} public void process() { java.util.Arrays.sort(i); //將陣列排序 } public void output() { System.out.println("\n排序後的i陣列"); for (int j=0;j<i.length;++j) System.out.print(i[j]+" "); } public static void main(String[] args) { sort a=new sort() ; a.process(); a.output(); } } 回參考資料型態
搜尋陣列中的元素 • Arrays類別中提供的「binarySearch」方法可用來在陣列中搜尋特定的元素,如果可以在陣列中搜尋到特定的元素,則會傳回該元素的索引值,如果搜尋不到,則會傳回-1。「binarySearch」方法最簡單的使用方式為: Arrays.binarySearch(陣列名稱, 型別 key); • 如果您不想使用binarySearch方法來搜尋陣列的內容,您必需利用迴圈來逐一的比對陣列中的每個元素的值
最常用的搜尋法: • 最常用的搜尋方法有循序搜尋法和二分搜尋法。 • 循序搜尋法是將資料一筆一筆的搜尋,直到被找到為止,所以此搜尋法只適合資料較少時使用。 • 二分搜尋法的效率就比循序搜尋法好,但是使用二分搜尋法前,必須先將資料排序才有效。
搜尋排序後之陣列值 語法: java.util.Arrays.binarySearch(要搜尋的陣列,要搜尋的資料); 說明: 傳回值為一整數,代表該搜尋的資料在陣列的索引位置,如果找不到資料,就會傳回負值,否則傳回正值。另外,要使用此方法前,必須先排序陣列,否則搜尋結果就沒有意義。 範例: class Sample5_14 { public static void main(String[] args) { char[] i = {'e', 'c', 'a', 'f' , 'd' ,'b'}; java.util.Arrays.sort(i); int j = java.util.Arrays.binarySearch(i,'b'); System.out.println("b字元在i陣列中的位置? Ans:"+j); } } 回參考資料型態
String物件的內容是不能更改的 • 「String」物件一旦建立後,其內容就無法再「更改(immutable)」了。 • 即使您將該String變數重新指定新的內容,Java的運作方式是新建立一個String物件,再將新的String物件指定給String變數。
字串的比對 • 要比對字串可以使用以下方法: • 1. 字串比對(區分大小寫) • str1.equals(str2); • 2. 字串比對(不區分大小寫) • str1.equalsIgnoreCase(str2); • 說明: • equals()或equalsIgnoreCase()均會傳回一個布林值, • 1.若傳回true,則代表兩個字串比對結果是相同的。 • 2.若傳回false,則代表兩個字串比對結果是不相同的。 • 範例: • String s1="Hello Java!! "; • String s2="hello java!! "; • Boolean a=s1.equals(s2); //a=false • Boolean b=s1.equalsIgnoreCase(s2) //b=true 回參考資料型態
搜尋字串 要搜尋字串中的字元可以使用以下方法: 字串變數.indexOf(‘欲搜尋的字元’); 字串變數.indexOf(String substr ); 說明: indexOf()會傳回一個整數變數,代表搜尋到的字元位置。 範例: String s="Hello Java!! "; int a = s.indexOf("Ja"); //a=6 回參考資料型態