# 陣列

  • 是一種容器 (放東西的東西),有以下特點:
    • 其中所有的元素具有相同的資料型態
    • 一旦創建後,不能改變大小
  • 陣列中的每個數據被稱為元素

# 陣列宣告

  • new 創建陣列
<型態>[] <名稱> = 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]; // 表示陣列的第一個元素,每個元素都是 int 型態的變數
number[9]; // 表示陣列最大的下標

# 賦值

int[] a = new int[10];
a[0] = 5;
int[] b = a;
b[0] = 16;
System.out.println(a[0]); // 輸出結果: 16
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]+" "); // 輸出結果為: 1 2 4 8 16

陣列變數 ≠ 陣列

  • 陣列變數陣列 的管理者,而非所有者,非 陣列 本身
  • 陣列 必須創建出來,然後交給 陣列變數 來管理
  • 陣列變數 之間的賦值,是管理權限的賦予
  • 陣列變數 之間的比較,是判斷是否管理同一個陣列
  • 兩個 陣列 即使內容相同也不等同,判斷兩個 陣列 是否相等,需利便逐個元素
  • 複製 陣列 ,必須歷遍源陣列,將每個元素逐一拷貝給目的陣列

# 歷遍

# for 循環

讓循環變數 i 落在 0length 之間,最大值會剛好是陣列的最大有效下標。

// 判斷某個數據是否在陣列內部
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 循環

for(<型態><變數>:<陣列>){
  ...
}
  • 陣列中的每一個元素取出來作為這個型態的變數
  • 非常適合用在讀出陣列,但是不能修改陣列,也不能知道索引值。
// 判斷某個數據是否在陣列內部
int[] data = {2,3,4,5,6,7,8,9,10};
int x = in.nextlnt();
boolean found = false;
for(int k : data) {
    // 對於 data 中的每一个元素,循環的每一輪將其取出作為一個 k。
    // 所以每一輪的 k 都是變化的,第一輪 k=data [0],第二輪 k=data [1]...
    if(x == k) {
        found = true;
        break;
    }
}
if( found ) {
    System.out.println(x+"在其中");
} else {
    System.out.println(x+"不在其中");
}

# 建構質數表

boolean[] isPrime = new boolean[1000]; // 初始化時,所有元素 = false
for(int i = 0; i < isPrime.length; i++) {
    isPrime[i] = true; // 歷遍後所有元素為 true
}
for(int i = 2; i < isPrime.length; i++) {
    if(isPrime[i]) { // 如果 i 沒有被標記為質數時
        for(int k = 2; i * k < isPrime.length; k++) {
            // 將 2*i、3*i、4*i 直至 a*i < n 的數標示為非質數
            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]; // 可以理解為 a 是一個 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");
    }
}
更新於 閱讀次數

用實際行動犒賞爆肝的我😀

Zrn Ye LinePay

LinePay