--- tags: Java --- # Java -- 陣列與字串 ## 陣列 * 陣列:把相同資料型態的變數集合起來,以一個名稱來代表,使用索引值存取元素,每一個元素相當於是一個變數 * 索引從"0"開始,指向陣列第一個變數值 ## 一維陣列 ### 宣告 :::info ```java= type[ ] array_identifier; ``` * type 表示儲存在陣列中的值為基本資料型態或是物件型態 * [&nbsp;] 用來告知編譯器,你所宣告的是一維陣列參考 * array_identifier 是你指派給陣列的名稱 ::: ### 實例化 :::info ```java= array_identifier = new type [length] ``` * 使用 new 關鍵字來建立一維陣列 * length 用來表示陣列的大小(元素的數目) ::: ### 存取 :::info ```java= array_identifier[index] = value; ``` * array_identifier 是陣列的名稱 * index 表示該值將被放置在陣列中的位置 * value 為要指派至陣列 index 位置的值 ::: 範例: int[ ] arr = new int [3] arr[0] = 1; arr[1] = 2; ### 宣告、實例化及初始化 :::info ```java= type[ ] array_identifier = {,分隔的值或運算式} ; ``` ::: 範例: int[ ] arr = {1, 2, 3}; ### 走訪 1. for 迴圈 2. foreach 迴圈 :::info ```java= for(元素型態 迴圈控制變數:集合或陣列名稱) // 迴圈主體; ``` ::: >參考資料 >* [Java for-each迴圈的用法](https://lakesd6531.pixnet.net/blog/post/342603565-java-for-each%E8%BF%B4%E5%9C%88%E7%9A%84%E7%94%A8%E6%B3%95) > * [深入理解java中for和foreach迴圈](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/316073/) 範例: ![](https://i.imgur.com/4hVIunH.png) ![](https://i.imgur.com/eSEQqWI.png) > 參考資料: > * [JAVA-一維陣列](http://www.codedata.com.tw/book/java-basic-source/ch10-1.htm) ## 二維陣列 ### 宣告 :::info ```java= type[ ][ ] array_identifier; ``` * type 表示儲存在陣列中的值為基本資料型態或是物件型態 * [&nbsp;][&nbsp;]用來告知編譯器,你宣告的是二維陣列參考 * array_identifier 是你指派給陣列的名稱 ::: ### 實例化 :::info ```java= array_identifier = new type [number_of_arrays][length] ``` * number_of_arrays 為 array_identifier 陣列中擁有的一維陣列數量 * length 是 array_identifier 中每個一維陣列的長度 ::: ### 存取 :::info ```java= array_identifier[left index][right index] = value; ``` * 第一個索引值代表列 (Row) * 第二個索引值代表行 (Column) ::: ### 宣告、實例化及初始化 :::info ```java= type[ ][ ] array_identifier = {{,分隔的值或運算式},{,分隔的值或運算式}}; ``` ::: ### 走訪 1. 巢狀 for 迴圈 2. 巢狀 foreach 迴圈 範例: ![](https://i.imgur.com/W6sB6Sd.png) > 參考資料: > * [JAVA-二維陣列](http://www.codedata.com.tw/book/java-basic-source/ch10-2.htm) ## 字串 * Java字串為String物件 * 字串內容不能更改,一旦建立字串後,就無法改變其值。只能重新指定成新的字串字面值或另一個字串變數 * String 類別是 Java 標準類別庫眾多類別的其中之一,能夠提供儲存一連串的字元(陣列) * 以雙引號" "包括的文字,編譯器會建立 String 物件來表示該文字 ### 使用 String 類別建構 :::info ```java= String 字串參考名稱 = "字串實例"; ``` ::: * 直接使用雙引號包括所產生的 String 物件,在程式運行期間將一直存在於 String 儲存池中,雙引號包括的字串只要是字元內容相同,都會重複使用 String 儲存池中的同一個 String 物件 範例: ```java= public class StringDemo{ public static void main(String[] args){ String text1 = "Hello!"; String text2 = "Hello!"; System.out.println("Hello!" == "Hello!"); System.out.println(text1 == "Hello!"); System.out.println(text2 == "Hello!"); System.out.println(text1 == text2); } } ``` ![](https://i.imgur.com/3mfc5zZ.png) > 附註:當關係運算子"=="使用於兩個物件之比較時,目的是比較兩個物件是否為同一個物件,也就是比較是否存在同一個記憶體位置 ![](https://i.imgur.com/f7U8ho5.png) ### 使用 new 關鍵字建構 :::info ```java= String 字串參考名稱 = new String("字串實例") ``` ::: * 使用 new 建立的 String 實例是在運行時產生。與使用雙引號" "包括的文字,在運行時會以一個 String 實例存在於 String 儲存池中不同 範例: ```java= public class NewString{ public static void main(String[] args){ String name1 = "Justin Lin"; String name2 = new String("Justin Lin"); System.out.println(name1 == "Justin Lin"); System.out.println(name2 == "Justin Lin"); System.out.println(name1 == name2); } } ``` ![](https://i.imgur.com/sh0yv50.png) ![](https://i.imgur.com/daENCHW.png) >參考資料 >* [JAVA-String 類別](http://www.codedata.com.tw/book/java-basic-source/ch9-1.htm) ### 字串處理 #### 字串長度與大小寫轉換 ![](https://i.imgur.com/dWL1kWM.png) #### 字元搜尋 ![](https://i.imgur.com/ZLNMnAJ.png) #### 子字串搜尋 ![](https://i.imgur.com/lTdv7wN.png) #### 子字串和字元處理 ![](https://i.imgur.com/tqKbuvk.png) #### 字串的比較 ![](https://i.imgur.com/4bjtfyv.png) 範例: ![](https://i.imgur.com/4lL9KsH.png) ![](https://i.imgur.com/H8d7EDq.png) ### StringBuffer字串緩衝區類別 * StringBuffer字串緩衝區類別建立的 StringBuffer物件可以直接修改原字串的內容 * 一定要使用new運算子來建立物件 :::info ```java= StringBuffer 字串參考名稱 = new StringBuffer("字串實例"); ``` ::: #### 新增、反轉 ![](https://i.imgur.com/WSfbY0I.png) #### 插入、刪除、取代 ![](https://i.imgur.com/CIzVScj.png) 範例: ![](https://i.imgur.com/xTichSU.png) ![](https://i.imgur.com/8n7TRG7.png) ### 數值與字串間的轉換 #### 字串轉數值 ![](https://i.imgur.com/aE4K8Mp.png) 範例: ![](https://i.imgur.com/nmawfsY.png) ![](https://i.imgur.com/BfIDfNg.png) #### 數值轉字串 ![](https://i.imgur.com/Jxx3Rqs.png) 範例: ![](https://i.imgur.com/joqPrEC.png) ![](https://i.imgur.com/0vj9jJl.png) ### 字串物件陣列 範例: ![](https://i.imgur.com/0qPb9fm.png) ![](https://i.imgur.com/MZGi4OH.png) ### 泡沫排序法(Bubble Sort) * 陣列依序兩兩比較交換 範例: ![](https://i.imgur.com/25tC7AZ.png) ![](https://i.imgur.com/EF5NECP.png) ### 線性搜尋法(Sequential Search) * 從陣列的第1個元素開始走訪整個陣列,一個一個比較是否有搜尋值 範例: ![](https://i.imgur.com/yaoFdRA.png) ![](https://i.imgur.com/aZVeCVE.png) ![](https://i.imgur.com/OP5GvIx.png) ### 二元搜尋法(Binary Search) * 資料需要是已經排好序的資料 * 分割資料的搜尋方法: 先檢查排序資料的中間元素,如果等於鍵值就是找到;如果小於鍵值,表示資料是在前半段,否則在後半段。然後繼續分割的半段資料重覆上述操作,直到找到或已經沒有資料可以分割為止 範例: ![](https://i.imgur.com/KCmRzMF.png) ![](https://i.imgur.com/u48jJs2.png) ![](https://i.imgur.com/UEhy3wL.png) ### 練習 一. 請建立 Java 語言的 reverse() 類別方法,可以將陣列元素反轉,索引 0 的元素成為最後一個索引值,最後一個索引元素成為第一個元素。 ```java= public class Ch6a { // 類別方法:reverse private static void reverse(int[] arr){ int i, temp; int j = arr.length ; for ( i=0; i < j/2; i++ ){ temp = arr[i]; arr[i] = arr[j-1-i]; arr[j-1-i] = temp; } } // 主程式 public static void main(String[] args) { int[] arr = {1,2,10,7,8,9,5}; int i; System.out.print("原始陣列: "); for ( i = 0; i < arr.length; i++ ) System.out.print("[" + arr[i] + "]"); System.out.print("\n"); reverse(arr); System.out.print("反轉陣列: "); for ( i = 0; i < arr.length; i++ ) System.out.print("[" + arr[i] + "]"); } } ``` ![](https://i.imgur.com/EmpL3an.png) 二. 請建立 Java 程式宣告一個 3X3 的二維陣列,陣列值是使用亂數產生,範圍為 1~100,再計算每一列的總和及平均。 ```java= public class Ch6b { // 主程式 public static void main(String[] args) { int i, j, sum; float aver; int [][] arr = new int [3][3]; System.out.println("3x3陣列:"); for ( j=0; j < arr.length; j++ ){ sum = 0; aver = 0; for ( i=0; i < arr[j].length; i++ ){ arr[j][i] = (int)(Math.random()*100+1); System.out.print("["+ arr[j][i] + "]"); sum += arr[j][i]; aver = (float)sum / arr[j].length; } System.out.print("\t=> 小計:" + sum); System.out.println(" 平均:" + aver); } } } ``` ![](https://i.imgur.com/hl1FPFp.png) 三. 請建立 getMax() 和 getMin() 類別方法,參數是 int 陣列,可以傳回陣列中的最大值和最小值,並且設計測試的 Java 程式,程式使用亂數產生 1~500 的陣列值。 ```java= public static int getMin( int[] arr ){ int i, j ,temp, min; for ( j=arr.length; j>1; j-- ){ for ( i=0; i < j-1; i++ ){ if ( arr[i+1] < arr[i] ){ temp = arr[i+1]; arr[i+1] = arr[i]; arr[i] = temp; } } } i = 0; min = arr[i]; return min; } public static int getMax( int[] arr ){ int i, j ,temp, max; for ( j=arr.length; j>1; j-- ){ for ( i=0; i < j-1; i++ ){ if ( arr[i+1] < arr[i] ){ temp = arr[i+1]; arr[i+1] = arr[i]; arr[i] = temp; } } } j = arr.length; max = arr[j-1]; return max; } // 主程式 public static void main(String[] args) { int[] arr = new int[7]; int i; System.out.print("陣列:"); for ( i=0; i < arr.length; i++ ){ arr[i] = (int)(Math.random()*500+1); System.out.print("[" + arr[i] + "]"); } System.out.print("\n"); int min = getMin(arr); System.out.println("陣列最小值: " + min); int max = getMax(arr); System.out.println("陣列最大值: " + max); } } ``` ![](https://i.imgur.com/XbDAV6M.png)