# 陣列
- 是一種容器 (放東西的東西),有以下特點:
- 其中所有的元素具有相同的資料型態
- 一旦創建後,不能改變大小
- 陣列中的每個數據被稱為元素
# 陣列宣告
| <型態>[] <名稱> = new <型態>[元素個數]; |
| int[] grades = new int[100]; |
| double[] averages = new double[20]; |
- 元素個數必須是整數
- 元素個數必須給出
- 元素個數可以是變數
| int[] scores = {80,85,92,86,80,78,94}; |
- 陣列大小不需要給出
- 可以用
length
獲得陣列大小
# 陣列元素
每個元素都是同型態的變數,並且下標都是從 0 開始,最大的下標是 ` 元素個數 - 1
| int[] number = new int[10]; |
| number[0]; |
| number[9]; |
# 賦值
| int[] a = new int[10]; |
| a[0] = 5; |
| int[] b = a; |
| b[0] = 16; |
| |
| System.out.println(a[0]); |
| int[] a1 = {2,4,8,16,32}; |
| int[] a2 = a1; |
| |
| for(int i = 0;i<a2.length;i++) |
| a2[i] /= 2; |
| |
| for(int i = 0;i<a1.length;i++) |
| System.out.print(a1[i]+" "); |
陣列變數 ≠ 陣列
陣列變數
是 陣列
的管理者,而非所有者,非 陣列
本身陣列
必須創建出來,然後交給 陣列變數
來管理陣列變數
之間的賦值,是管理權限的賦予陣列變數
之間的比較,是判斷是否管理同一個陣列- 兩個
陣列
即使內容相同也不等同,判斷兩個 陣列 是否相等,需利便逐個元素 - 複製
陣列
,必須歷遍源陣列,將每個元素逐一拷貝給目的陣列
# 歷遍
# for 循環
讓循環變數 i
落在 0
到 length
之間,最大值會剛好是陣列的最大有效下標。
| |
| int[] data = {2,3,4,5,6,7,8,9,10}; |
| int x = in.nextlnt(); |
| int loc = -1; |
| for( int i=0; i < data.length; i++ ) { |
| if(x == data[i]) { |
| loc = i; |
| break; |
| } |
| } |
| if( loc > -1 ) { |
| System.out.println(x+"是第"+(loc+1)+"個"); |
| } else { |
| System.out.println(x+"不在其中"); |
| } |
# for-each 循環
- 陣列中的每一個元素取出來作為這個型態的變數
- 非常適合用在讀出陣列,但是不能修改陣列,也不能知道索引值。
| |
| int[] data = {2,3,4,5,6,7,8,9,10}; |
| int x = in.nextlnt(); |
| boolean found = false; |
| for(int k : data) { |
| |
| |
| if(x == k) { |
| found = true; |
| break; |
| } |
| } |
| if( found ) { |
| System.out.println(x+"在其中"); |
| } else { |
| System.out.println(x+"不在其中"); |
| } |
# 建構質數表
| boolean[] isPrime = new boolean[1000]; |
| |
| for(int i = 0; i < isPrime.length; i++) { |
| isPrime[i] = true; |
| } |
| for(int i = 2; i < isPrime.length; i++) { |
| if(isPrime[i]) { |
| for(int k = 2; i * k < isPrime.length; k++) { |
| |
| isPrime[i*k]= false; |
| } |
| } |
| } |
| |
| for(int i= 2;i<isPrime.length;i++) { |
| if(isPrime[i]) { |
| System.out.print(i+" "); |
| } |
| } |
# 二維陣列
| int[][] a = new int[3][5]; |
# 歷遍
| for(int i = 0;i<3;i++){ |
| for(int j = 0;j<5;j++){ |
| a[i][j] = i*j; |
| } |
| } |
a[i][j]
是一個 int
,表示第 i
行的第 j
列上的元素。
# 初始化
| int[][] a = { |
| {1,2,3,4,5}, |
| {1,2,3}, |
| }; |
- 每行一個 {} ,逗號分隔
- 最後一個逗號可以存在,來自 C 語言喔~~
- 如果省略,表示補零
# tic-tac-toe 遊戲設計
# 讀入矩陣
| final int SIZE = 3; |
| int[][] board = new int[SIZE][SIZE]; |
| boolean gotResult = false; |
| int numOfX = 0; |
| int numOfO = 0; |
| |
| for ( int i=0; i<SIZE; i++ ) { |
| for ( int j=0; j<SIZE; j++ ) { |
| board[i][j] = in.nextInt(); |
| } |
| } |
# 檢查行
| for ( int i=0; i<SIZE; i++ ) { |
| numOfX = 0; |
| numOfO = 0; |
| for ( int j=0; i<SIZE; i++ ) { |
| if ( board[i][j] == 1 ) { |
| numOfX ++; |
| } else { |
| numOfO ++; |
| } |
| } |
| if ( numOfX == SIZE || numOfO == SIZE ) { |
| gotResult = true; |
| break; |
| } |
| } |
# 檢查列
| if ( !gotResult ) { |
| for ( int i=0; i<SIZE; i++ ) { |
| numOfX = 0; |
| numOfO = 0; |
| for ( int j=0; i<SIZE; i++ ) { |
| if ( board[j][i] == 1 ) { |
| numOfX ++; |
| } else { |
| numOfO ++; |
| } |
| } |
| if ( numOfX == SIZE || numOfO == SIZE ) { |
| gotResult = true; |
| break; |
| } |
| } |
| } |
# 檢查對角線
| if ( !gotResult ) { |
| numOfX = 0; |
| numOfO = 0; |
| for ( int i=0; i<SIZE; i++ ) { |
| if ( board[i][SIZE-i-1] == 1 ) { |
| numOfX ++; |
| } else { |
| numOfO ++; |
| } |
| } |
| if ( numOfX == SIZE || numOfO == SIZE ) { |
| gotResult = true; |
| } |
| } |
# 檢查否對角線
| if ( !gotResult ) { |
| numOfX = 0; |
| numOfO = 0; |
| for ( int i=0; i<SIZE; i++ ) { |
| if ( board[i][SIZE-i-1] == 1 ) { |
| numOfX ++; |
| } else { |
| numOfO ++; |
| } |
| } |
| if ( numOfX == SIZE || numOfO == SIZE ) { |
| gotResult = true; |
| } |
| } |
# 輸出結果
| if ( gotResult ) { |
| if ( numOfX == SIZE ) { |
| System.out.println("X WIN"); |
| } else { |
| System.out.println("O WIN"); |
| } |
| } |