1.25k likes | 1.36k Views
第 5 章 陣列與字串. Java 2 程式設計入門與應用. 目錄. 5-1 陣列 5-2 排序與搜尋 5-3 字元與字串陣列 溫故知新 自我突破習題. 5-1 陣列. 5-1.1 陣列的意義 5-1.2 一維陣列的宣告 5-1.3 一維陣列初始值的設定 5-1.4 二維陣列的宣告 5-1.5 二維陣列初始值的設定. 前言:. 陣列( Array )是一群由相同型態的元素所集合而成的特殊型態,當程式需要 一系列 具有相同型態的多項資料時,便可以利用陣列來存取資料,有別於每個變數只能儲存一個資料的特性。.
E N D
第5章 陣列與字串 Java 2 程式設計入門與應用
目錄 • 5-1 陣列 • 5-2 排序與搜尋 • 5-3 字元與字串陣列 • 溫故知新 • 自我突破習題
5-1 陣列 • 5-1.1 陣列的意義 • 5-1.2 一維陣列的宣告 • 5-1.3 一維陣列初始值的設定 • 5-1.4 二維陣列的宣告 • 5-1.5 二維陣列初始值的設定
前言: • 陣列(Array)是一群由相同型態的元素所集合而成的特殊型態,當程式需要一系列具有相同型態的多項資料時,便可以利用陣列來存取資料,有別於每個變數只能儲存一個資料的特性。
5-1.1 陣列的意義 • 變數是指程式中可以用來儲存資料空間的名稱,使用者可以用它來存放任何數值、文字……等資料,如同每個人有一個名字一樣,當程式中需要使用某變數時,可以用此名稱來稱呼它。 • 若程式中需要一系列具有相同型態的多項資料時,如果一個一個加以設定成變數的話,對於量小的資料,可能還好,但對於量大的資料,可能吃不消,光是定義變數名稱,就得想好幾個。這時如果使用陣列來代表這一系列的多項資料,便輕鬆多了! • 其實,可以將陣列想成電腦中一塊連續的記憶體,這塊連續記憶體被分成許多相同大小的小空間,每個小空間會依照順序從0開始給予一個編號,日後若需要某個小空間的資料,就可以用編號來存取該小空間的資料。
一維陣列: • 依照排列的方式,陣列分為一維陣列和多維陣列。 • 一維陣列是指這些小空間是以直線的方式排列,而且每個小空間都依序編號來區別,此順序編號稱為索引值(Index),而陣列中每一個小空間所存放的資料稱為元素(Element)。
多維陣列: • 而多維陣列是指二維陣列、三維陣列、四維陣列……等,以二維陣列來說,二維陣列是指這些小空間會以兩個編號來區別。
5-1.2 一維陣列的宣告 • 在程式中想要使用陣列儲存資料時,必須先為陣列命名,以便在程式中呼叫。 • 陣列命名的原則與變數都是一樣的,而且資料型別也與變數相同,所以如果對變數的命名方式與變數資料型別都了解的話,可以直接應用在陣列中。 • 在Java中,只要在陣列名稱前面加上資料型別的名稱(資料的型別與變數的型別一樣,有位元組、短整數、整數、長整數、浮點數、倍精度浮點數、布林、字元等),就達到宣告的動作。
以下是宣告一維陣列的語法: • 在宣告陣列時,如果不指定初始值,就要利用關鍵字new配置記憶體空間給該陣列,其語法如下: • 上述語法中的陣列名稱只要依照變數的命名規則命名即可,比較特別的是,利用new配置記憶體空間時,必須在資料型別後面加上[],並在[]中填上此陣列的大小(Size),例如:int X[]=new int[7],就表示陣列名稱為X,而有7個整數元素的陣列。
以下是宣告不同資料型別的一維陣列,其程式碼如下:以下是宣告不同資料型別的一維陣列,其程式碼如下: • 指定陣列的資料型別後,陣列內各元素都是相同的資料型別,例如:short b[]=new short[11],表示系統連續分配了11個單位的短整數空間給b陣列,若一個短整數佔用2 Bytes,則short b[]=new short[11]就是分配了22 Bytes。
以下是同樣資料型別的陣列一起放在資料型別的後面,宣告的程式碼如下:以下是同樣資料型別的陣列一起放在資料型別的後面,宣告的程式碼如下: • 除了將多個陣列一行一行分別宣告以外,也可以將多個同樣資料型別的陣列一起放在資料型別的後面,並以逗號,分隔;但若是不同資料型別的陣列要在同一行宣告,則要以分號;分隔,例如:
5-1.3 一維陣列初始值的設定 • 當宣告一維陣列名稱X後,就可以一一表示陣列內的各元素,第1個元素以X[0]表示,第2個元素以X[1]表示,第3個元素以X[2]表示,第4個元素以X[3]表示,第5個元素以X[4]表示,第6個元素以X[5]表示,第7個元素以X[6]表示。
下圖是宣告內含7個元素的一維陣列後,陣列內各元素表示的示意圖:下圖是宣告內含7個元素的一維陣列後,陣列內各元素表示的示意圖: • 跟變數一樣,宣告陣列以後,也可以指定陣列的初始值,在尚未指定初始值前,每個陣列元素的初始值皆預設為0或false(布林)。 • 與變數最大的不同是,變數只是代表一個資料,所以其初始值只要指定一個就可以了,但陣列是代表一系列具有相同型態的多項資料,所以要指定陣列的初始值時,要一一指定陣列內各元素的初始值。
指定陣列初始值的語法如下: • 不過如果這樣一行一行寫,實在是太麻煩了,所以通常會在陣列名稱後面加上={},在{}內依序寫上各元素的初始值,並以逗號,分隔每個元素即可;此時可以省略陣列大小的設定,編譯程式會根據初始值的個數自動判斷陣列的大小,其語法如下:
宣告陣列後,可能會使用到下列的功能: • 取得陣列的大小:利用陣列的length函式可以取得陣列的大小,也就是陣列的元素個數,其語法如下: • 改變陣列的大小:在Java中只要重新配置記憶體位置,即可動態修改陣列的大小,而修改陣列的大小後,陣列中的元素內容會被清空,預設為0或false(布林),例如下面的程式碼將陣列大小5修改為8:
上述的程式碼分析如下: • 第4行宣告整數陣列x,並設定初始值,所以不需要利用關鍵字new就可以自動配置記憶體,而第5行利用x.length取得陣列大小時,總共有5個陣列元素。 • 第7~9行利用迴圈顯示陣列x中的每個元素內容,因為陣列的第一個索引值為0,陣列大小為x.length,所以第7行指定計次變數i的初始值為0,並設定條件表示式為i< x.length。 • 第10行利用關鍵字new修改陣列x的大小為3,就是只能儲存3個元素,所以第4行設定的陣列初始值已經被清空了! • 第13~17行的迴圈是用來反覆要求使用者輸入整數。 • 第14行是反覆要求使用者輸入整數,此敘述內含計次變數i,所以第1次執行迴圈時,會顯示“請輸入第1個整數”;第2次執行迴圈時,會顯示“請輸入第2個整數”……。第16行是反覆將使用者輸入的數指定給x[i],所以第1次執行迴圈時,會將所輸入的整數指定給x[0];第2次執行迴圈時,會將所輸入的整數指定給x[1],以此類推。 • 第18~19行的迴圈是用來反覆顯示使用者輸入的整數,第18行是指定計次變數i的初始值和條件表示式,而第19行是迴圈內要反覆執行的敘述,意即反覆顯示各元素的值,也就是x[0]、x[1]、x[2]……等值。
完成後,執行程式的畫面顯示如下: • 由上面的例子可以發現,利用迴圈來設計陣列初值指定作業,就可以不必撰寫冗長的程式碼。
5-1.4 二維陣列的宣告 • 在5-1.2和5-1.3節中介紹的陣列都只是一維的,事實上,陣列可以是多維(Multi-Dimension)的,例如:二維、三維、四維、……,甚至多達數十維,比較常見的是二維陣列。
何時需要使用二維陣列來表示資料呢? • 簡單的說,如果資料可以以表格方式來呈現的話,就可以使用二維陣列來表示表格內的所有資料,例如:有一學生成績表格,內含5個學生的成績資料,每位學生有學號、國文、英文、數學、自然、社會等資料,可以整理成如下的表格:
以下是宣告二維陣列的語法: • 如果利用一維陣列來儲存這些資料的話,可能需要6個陣列,例如:id[]、chinese[]、english[]、math[]、nature[]、society[],而只需1個二維陣列就可以將所有的資料儲存起來。 • 宣告二維陣列時,只要在二維陣列名稱前面加上資料型別名稱,就達到宣告的動作,資料型別有位元組、短整數、整數、長整數、浮點數、倍精度浮點數、布林、字元等。 • 二維陣列與一維陣列相同,如果不指定初始值,就要利用關鍵字new配置記憶體空間給該陣列,其語法如下:
利用關鍵字new配置記憶體空間時,須在資料型別後面加上[][] : • 上述語法中的陣列名稱只要依照變數命名規則來命名即可,比較特別的是,利用new配置記憶體空間時,必須在資料型別後面加上[][],並在[][]中分別填上列數和行數。
以上述表格為例,可以宣告二維陣列如下: • 宣告此grade陣列後,可得知第一個(可以想成列)索引值範圍為0~4,第二個(可以想成行)索引值範圍為0~5,此陣列內含5*6個元素的資料。
5-1.5 二維陣列初始值的設定 • 當宣告二維陣列名稱後,就可以一一指定陣列內的各元素。 • 下圖是宣告二維陣列後,陣列內各元素表示的示意圖:
下面舉例,宣告二維陣列名稱grade,可分別指定陣列內元素的值:下面舉例,宣告二維陣列名稱grade,可分別指定陣列內元素的值: • 若以下列成績表格為例,當宣告二維陣列名稱grade後,就可以分別指定陣列內元素的值,例如:grade[0][0]=10001,grade[0][1]=94,grade[0][2]=61,grade[0][3]=61,grade[0][4]=98,grade[0][5]=68,grade[1][0]=10002,grade[1][1]=85,grade[1][2]=92,……。
宣告二維陣列同時指定所有陣列元素的值,其語法如下:宣告二維陣列同時指定所有陣列元素的值,其語法如下: • 宣告二維陣列時也可以同時指定所有陣列元素的值,只要在二維陣列名稱後加上={},並在{}內依序寫上各元素的初始值即可,其語法如下:
如果以上述成績表格為例,可以宣告二維陣列並指定初始值如下:如果以上述成績表格為例,可以宣告二維陣列並指定初始值如下:
二維陣列與一維陣列相似,可能會使用到下列幾項功能:二維陣列與一維陣列相似,可能會使用到下列幾項功能: • 取得陣列的列數:利用length函式可以取得陣列的列數,其語法如下: • 取得某列的元素個數:利用length函式可以取得二維陣列中某列的元素個數,其語法如下: • 改變陣列的大小:利用關鍵字new可以修改陣列的大小,而陣列中的元素內容會被清空,預設為0或false(布林),例如下面的程式碼將5列6行的陣列修改為8列8行的陣列:
以下範例應用二維陣列,將三次成績的總平均計算出來,其程式碼如下:以下範例應用二維陣列,將三次成績的總平均計算出來,其程式碼如下: • 以下這個範例就是應用二維陣列,讓使用者依序輸入4個學生的學號、第一次月考成績、第二次月考成績和期末考成績的資料,然後將三次成績的總平均計算出來,以二維陣列儲存並顯示這個成績表,其程式碼如下:
上述應用二維陣列計算三次總平均的程式碼分析如下-1:上述應用二維陣列計算三次總平均的程式碼分析如下-1: • 第5行宣告二維陣列變數,因為有4個學生,每個學生將記錄5種資料(包含總平均),所以可以宣告int grade[][]=new int[4][5];。 • 第8~23行的迴圈是用來反覆要求使用者輸入資料,第8行指定計次變數i的初始值和條件表示式(有四個學生,所以可以設定初始值從0到grade.length),而第9~22行是迴圈內要反覆執行的敘述。 • 第9~22行會反覆要求使用者輸入資料,第1次執行迴圈時,i=0,所以會將使用者輸入的資料(也就是第0+1個學生的資料)依序指定給grade[0][0]、grade[0][1]、grade[0][2]和grade[0][3],並將計算出此學生成績的總平均指定給grade[0][4];第2次執行迴圈時,i=1,所以會將使用者輸入的資料(也就是第1+1個學生的資料)依序指定給grade[1][0]、grade[1][1]、grade[1][2]和grade[1][3],並將計算出此學生成績的總平均指定給grade[1][4],以此類推。 • 第24行是顯示成績表的標題列,利用"\t"可以在顯示的資料後面產生一個水平定位點,以便與成績等資料對齊。
上述應用二維陣列計算三次總平均的程式碼分析如下-2:上述應用二維陣列計算三次總平均的程式碼分析如下-2: • 第26~32行的迴圈會顯示使用者輸入的資料,以及計算總平均的資料。 • 第26行的grade.length表示grade陣列中有幾列資料,而第28行的grade[i].length則表示grade陣列第i列中有幾個元素。 • 第28~30行為內層迴圈,當第26行外層迴圈的計次變數等於0,內層迴圈第一次執行時,計次變數j=0,會顯示grade[0][0]元素的資料;內層迴圈第二次執行時,計次變數j=1,會顯示grade[0][1]元素的資料,以此類推。當外層迴圈第二次執行時,i=1,內層迴圈第一次執行時,計次變數j=0,會顯示grade[1][0]元素的資料,以此類推。 • 第29行敘述內含"\t",可以在顯示的資料後面產生一個水平定位點,以便與其他各列資料對齊。
5-2 排序與搜尋 • 5-2.1 排序 • 5-2.2 最大值和最小值 • 5-2.3 搜尋
前言: • 排序是將資料由大到小或由小到大依序排列,而搜尋是指依條件,找到資料所在的位置。 • 當程式中有大量的資料時,常常會應用這兩個技巧將資料呈現出來。
5-2.1 排序 • 排序(Sort)是將資料由小到大或由大到小依序排列,由小到大依序排列者稱為遞增排序,由大到小依序排列者稱為遞減排序。 • 何謂大?何謂小?如果是數值資料,則數值越大者越大;如果是字串資料,則中文字>小寫英文字母>大寫英文字母>數字,而中文字又以編碼越多者越大。 • 在Java中可以利用迴圈和條件判斷等技巧,撰寫程式來排序資料,也可使用內建的函式來排序。 • 依據不同特性的資料,分別有許多排序演算方法,較知名的排序方法如選擇排序法(Selection Sort)、交換排序法(Exchange Sort)、插入排序法(Insertion Sort)等。
使用選擇排序法排序: • 選擇排序法其基本想法是指在有n個元素的陣列中,選擇出關鍵值最小的元素,然後在剩下的n-1個元素中再選出關鍵值最小的元素,重複這種程序,直到第n-1個回合,就可完成排序作業。
選擇排序法有多種排序策略,下面就是選擇排序法策略的一種:選擇排序法有多種排序策略,下面就是選擇排序法策略的一種: • 第一回合:將第1位置的資料和其他位置的所有資料做比較。 • 當第1位置的資料大(小)於其他資料時,則兩個資料交換位置,使第1位置的資料永遠保持比較小(大)。 • 交換位置後,再將交換位置後的第1位置的資料與其他位置的資料相比較,直到所有的資料比較完。 • 第一回合比較完時,最小(大)的資料一定會出現在第1位置。 • 第二回合:因第1位置的資料已經是最小(大)的,所以將第2位置的資料與第3、4、……等位置的資料相比較。 • 當第2位置的資料比其他位置的資料大(小)時,就交換位置。 • 以此規則一直進行比較的動作。 • 當此範圍內有N個資料時,需進行N-1個回合,才能將所有的資料由小到大(由大到小)依序排列完成。
下面範例利用選擇排序法的排序策略,將以下十個數字由小排到大,程式碼如下:下面範例利用選擇排序法的排序策略,將以下十個數字由小排到大,程式碼如下: • 下面這個範例將用選擇排序法的排序策略,將60、100、80、30、90、70、20、50、10、40等十個數字由小排到大,其程式碼如下: