第 第 六 六 章 章 陣 陣 列 列
本章學習目標
認識陣列與一般資料型態的不同 認識一維與二維陣列
學習陣列的應用
6.1 一維陣列
一維陣列(1-dimensional array)可以存放多個相同資料型態的資料。
6.1.1 一維陣列的宣告與記憶體的配置
要使用陣列必須經過兩個步驟: (1)宣告陣列、(2)配置記憶體給該陣列:
資料型態 陣列名稱[]; // 宣告一維陣列 陣列名稱=new 資料型態[個數]; // 配置記憶體給陣列
格式6.1.1 一維陣列的宣告與 配置記憶體
下面的範例說明一維陣列宣告的方式,以及如何配置記憶體給它:
01 int score[]; // 宣告整數陣列 score
02 score=new int[4]; // 配置可存放 4 個整數的記憶體空間
執行完第一行後,編譯器會配置一塊記憶體給它,用來儲存指向陣列實 體的位址,如下圖所示:
score ?
int score[];
score 尚末指向陣列實 體的位址,所以 score 的內容為未知
第二行的記憶體配置動作可由下圖來表示:
陣列是屬於非基本資料型態,因此 score 儲存的是陣列實體的參考位址。
記憶體的 參考位址 Ox1000
score
score[0]
score[1]
score[2]
score[3]
Ox1000 Ox1004 Ox1008 Ox1012
score = new int[4];
配置4 個可供整數儲存的記憶空間
把記憶體空間的參考位址 設給score變數存放
陣列實體
格式 6.1.1 可以用較簡潔的方式來表示:
下面是宣告整數陣列 score,並配置記憶空間的範例:
int score[]=new int[4]; /* 宣告一個整數陣列 score,同時配置 一塊可存放4 個整數的記憶體空間,
以供該陣列使用*/
格式6.1.2
宣告陣列的同時便配 置記憶體
資料型態 陣列名稱[]=new 資料型態[個數];
將陣列 score 化為圖形表示:
陣列裡元素的個數
score
陣列名稱
每一格代表一個元素,每個元 素皆可存放整數型態的數值 int score[]=new int[4];
6.1.2 陣列的另一種宣告方式
Java 也允許我們把 score 陣列宣告成
int[] score; // 宣告 score 變數,其型態為整數陣列
6.1.3 陣列中元素的表示方法 陣列索引值的編號是由 0 開始。
下圖為 score 陣列中元素的表示法及排列方式:
score[0]
陣列共有 4 個元素
score
第1 個元素
int score[]=new int[4];
score[1] score[2] score[3]
第3 個元素
下面的程式是一維陣列的使用範例:
01 // app6_1,一維陣列 02 public class app6_1 03 {
04 public static void main(String args[]) 05 {
06 int i;
07 int a[]; // 宣告整數陣列 a
08 a=new int[3]; // 配置可存放 3 個整數的記憶體空間供整數陣列 a 使用 09 a[0]=5; // 設定第一個元素的值為 5
10 a[1]=8; // 設定第二個元素的值為 8 11
12 for(i=0; i<a.length; i++) // 印出陣列的內容 13 System.out.print("a["+i+"]="+a[i]+",\t");
14
15 System.out.println("\nLength of array = "+a.length); // 印出陣列長度 16 }
17 }
/* app6_1 OUTPUT--- a[0]=5, a[1]=8, a[2]=0, Length of array = 3 ---*/
取得陣列長度的格式:
陣列名稱.length
如下面的程式片段:
a.length // 印出陣列的長度
格式6.1.3 陣列長度的取得
6.1.4 陣列初值的設定
在宣告時就給與陣列初值的格式:
資料型態 陣列名稱[]={初值 1,初值 2,…,初值 n};
用此格式來宣告陣列並設定初值時,不需要將陣列元素的個數列出,如 下面的範例:
// 宣告並設定初值
int day[]={31,28,31,30,31,30,31,31,30,31,30,31};
格式6.1.4 陣列初值的設定
app6_2 是一維陣列設定初值的範例:
01 // app6_2,一維陣列的設值 02 public class app6_2 03 {
04 public static void main(String args[]) 05 {
06 int sum=0;
07 int a[]={15,6,8,7,12,7}; // 宣告整數陣列 a,並設定初值 08
09 for(int i=0;i<a.length;i++) // 計算陣列元素的和 10 sum+=a[i];
11
12 System.out.println("Average "+(float)sum/a.length);
13 } 14 }
/* app6_2 OUTPUT-- Average 9.166667 ---*/
6.1.5 簡單的範例:找出陣列元素的最大值與最小值 下面的程式碼說明如何找出陣列裡元素的最大值及最小值:
01 // app6_3,比較陣列元素值的大小 02 public class app6_3
03 {
04 public static void main(String args[]) 05 {
06 int i,min,max;
07 int a[]={74,48,30,17,62}; // 宣告整數陣列 a,並設定初值 08
09 min=max=a[0];
10 System.out.print("Elements in array a are ");
11 for(i=0;i<a.length;i++) 12 {
13 System.out.print(a[i]+" ");
14 if(a[i]>max) // 判斷最大值 15 max=a[i];
16 if(a[i]<min) // 判斷最小值 17 min=a[i];
18 }
19 System.out.println("\nMaximum is "+max); // 印出最大值
20 System.out.println("Minimum is "+min); // 印出最小值 21 }
22 }
/* app6_3 OUTPUT--- Elements in array a are 74 48 30 17 62 Maximum is 74
Minimum is 17
---*/
6.2 二維陣列
6.2.1 二維陣列的宣告與配置記憶體 二維陣列的宣告與配置記憶空間的格式:
資料型態 陣列名稱[][];
陣列名稱=new 資料型態[列的個數][行的個數];
如下面的範例:
int score[][];
score=new int[4][3];
格式6.2.1
二維陣列的宣告格式
以較為簡潔的方式來宣告陣列:
資料型態 陣列名稱[][]=new 資料型態[列的個數][行的個數];
以上述的寫法,在宣告的同時即配置一塊記憶體空間,以供該陣列使用:
int score[][]=new int[4][3];
格式6.2.2
二維陣列的宣告格式
下表為某汽車銷售公司有兩個業務員,於 2005 年的車輛銷售量:
2005 年銷售量 業務員
第一季 第二季 第三季 第四季
1 32 35 26 30
2 34 30 33 31
上面的資料可用一個 2 列 4 行的二維陣列來儲存,也就是把陣列宣告成
int sale[2][4]; // 宣告一個 2 列 4 行的整數陣列 sale
把 sale 陣列化為圖形表示:
(0,0) 30 (0,0)
32 (0,1) 35 (0,1)
35 (0,2) 26 (0,2)
26 (0,3) 32 (0,3)
30
(1,0) 33 (1,0)
34 (1,1) 34 (1,1)
30 (1,2) 30 (1,2)
33 (1,3) 29 (1,3)
31 第1列
第2列 第
1 行
第 2 行
第 3 行
第 4 行
每一格代表一個元素,每個元素皆為int 型態 陣列 sale
格式6.2.3 二維陣列初值的 設定格式
二維陣列初值的設定格式:
資料型態 陣列名稱[][]={{ 第 1 列初值 }, { 第 2 列初值 }, { … }, { 第 n 列初值 }};
在宣告時就設定陣列的初值,如下面的範例:
int sale[][]={{30,35,26,32}, // 二維陣列的初值設定 {33,34,30,29}};
每列的元素個數不同的二維陣列
二維陣列中每列的元素的個數可以不相同,如下面的範例:
int matx[][]={{31,12,14,11}, {33,34,30},
{12,81,32,14,17}};
想先宣告每列元素不相等之二維陣列,可以參考下面的寫法:
int matx[][]=new int[3][]; // 宣告二維陣列,並指定列數 matx[0] = new int[4]; // 指定第一列有 4 個元素 matx[1] = new int[3]; // 指定第二列有 3 個元素 matx[2] = new int[5]; // 指定第三列有 5 個元素
取得二維陣列的列數與特定列之元素的個數
取得二維陣列的列數與特定列之元素的個數之語法如下:
如下面的程式片段:
matx.length matx[0].length matx[2].length
格式6.2.4
取得二維陣列的列數與 特定列之元素的個數 陣列名稱.length // 取得陣列的列數
陣列名稱[列的索引值].length // 取得特定列元素的個數
6.2.2 二維陣列元素的引用及存取
下面的範例可列印出兩個業務員的銷售業績,並計算車輛的總銷售量:
01 // app6_4,二維陣列的輸入輸出 02 public class app6_4 03 {
04 public static void main(String args[]) 05 {
06 int i,j,sum=0;
07 int sale[][]={{32,35,26,30},{34,30,33,31}};//宣告陣列並設定初值 08
09 for(i=0;i<sale.length;i++) // 輸出銷售量並計算總銷售量 10 {
11 System.out.print("業務員"+(i+1)+"的業績分別為 ");
12 for(j=0;j<sale[i].length;j++) 13 {
14 System.out.print(sale[i][j]+" ");
15 sum+=sale[i][j];
16 }
17 System.out.println(); // 列印換行 18 }
19 System.out.println("\n 總銷售量為"+sum+"部車");
20 } 21 }
/* app6_4 OUTPUT--- 業務員1 的業績分別為 32 35 26 30 業務員2 的業績分別為 34 30 33 31
總銷售量為251 部車
---*/
6.3 多維陣列
下面的範例說明如何在三維陣列裡,找出所有元素的最大值:
01 // app6_5,
02 public class app6_5 03 {
04 public static void main(String args[]) 05 {
06 int A[][][]={{{21,32,65}, 07 {78,94,76}, 08 {79,44,65}, 09 {89,54,73}}, 10 {{32,56,89}, 11 {43,23,32}, 12 {32,56,78}, 13 {94,78,45}}};
14
15 int i,j,k,max=A[0][0][0]; // 設定 max 為 A 陣列的第一個元素 16
17 for(i=0;i<A.length;i++) // 外層迴圈 18 for(j=0;j<A[i].length;j++) // 中層迴圈 19 for(k=0;k<A[i][j].length;k++)// 內層迴圈 20 if(max<A[i][j][k])
21 max=A[i][j][k];
設定 2×4×3 陣列的初值
利用三個for 迴 圈 找 出 陣 列 的 最大值
22
23 System.out.println("max="+max); // 印出陣列的最大值 24 }
25 }
/* app6_5 OUTPUT--- max=94
---*/