Java – 陣列

陣列 Array

是用來存放多個有相關性的資料內容, 重點在於資料內容之間是有相關性的. 往往在程式設計中, 可能可以不需要運用的陣列來處理有相關性的資料內容, 只是以一般的多個各自獨立的變數來處理, 這往往會造成在開發邏輯上的不便, 以及日後的維護性不佳.

宣告方式


一維陣列的宣告方式:

型態[] 陣列變數名稱;
型態 陣列變數名稱[];

例如: 宣告一個存放int型態的陣列變數名稱為ary:

int[] ary;

教學影片-01

package tw.org.iii.myjava;

public class Brad09 {
  public static void main(String[] args) {
    int[] ary1;
    int ary2[];
    boolean[] ary3 = new boolean[3];	// 1. 元素個數是固定的; 2. 型別也是固定
    System.out.println(ary3[0]);
    System.out.println(ary3[1]);
    System.out.println(ary3[2]);
    //System.out.println(ary3[3]);
  }
}

 

陣列的特性


  • 存放元素的個數是固定的, 不能改變. 如果再度以new產生新的陣列, 可以重新調整元素個數, 但是之前的所有元素資料已經不存在.
  • 存放元素資料型態是一樣的.

教學影片-02

統計擲骰子的範例


骰子有六面, 模擬擲出多次的骰子, 並統計各面出現的次數. 分別以一般變數來處理, 以及以陣列處理的差異.

教學影片-03

 

一般變數處理:

public class Brad10 {
  public static void main(String[] args) {
    int p1, p2, p3, p4, p5, p6;
    p1 = p2 = p3 = p4= p5 = p6 = 0;
    
    for (int i=0; i<100; i++) {
      int rand = (int)(Math.random()*6)+1;
      switch (rand) {
      case 1: p1++; break;
      case 2: p2++; break;
      case 3: p3++; break;
      case 4: p4++; break;
      case 5: p5++; break;
      case 6: p6++; break;
      }
    }
    
    System.out.println("1點出現" + p1 + "次");
    System.out.println("2點出現" + p2 + "次");
    System.out.println("3點出現" + p3 + "次");
    System.out.println("4點出現" + p4 + "次");
    System.out.println("5點出現" + p5 + "次");
    System.out.println("6點出現" + p6 + "次");
  }
}

 

使用陣列處理:

int[] p = new int[6];	// [0]:0; [1]:0; ....[5]:0

for (int i=0; i<1000000; i++) {
  int rand = (int)(Math.random()*6);	
  p[rand]++;
}

模擬作弊的骰子


模擬一個出現4,5,6點的機率是1,2,3點的機率的兩倍

教學影片-04

 

public class Brad10 {

  public static void main(String[] args) {
    int[] p = new int[6];	// [0]:0; [1]:0; ....[5]:0
    
    for (int i=0; i<1000000; i++) {
      int rand = (int)(Math.random()*9);	// 0 , ... 8
      p[rand<=5?rand:rand-3]++;
    }
    
    for (int i=0; i<p.length; i++) {
      System.out.println((i+1) + "點出現" + p[i] + "次");
    }
    
    for (int v : p) {	// for-each
      System.out.println(v);
    }
    
    
  }

}

 

多維(二維以上)的陣列


教學影片-05

 

陣列初始化補遺


教學影片-06

 

洗牌(檢查重複)


教學影片-07

 

洗牌(交換原理)


教學影片-08

 

發牌給四個玩家(二維陣列應用)


教學影片-09

 

 

四個玩家攤牌顯示


教學影片-10

 

顯示花色撲克牌


教學影片-11

 

PokerV1.java

public class PokerV1 {

  public static void main(String[] args) {
    long start = System.currentTimeMillis();
    //  1. 洗牌
    int[] poker = new int[52];
    for (int i=0; i<poker.length; i++) {
      int rand = (int)(Math.random()*52);
      
      // 檢查機制
      boolean isRepeat = false;
      for (int j=0; j<i; j++) {
        if (poker[j] == rand) {
          isRepeat = true;
          break;
        }
      }
      
      if (!isRepeat) {
        poker[i] = rand;
        System.out.println(rand);
      }else {
        i--;
      }
    }
    System.out.println("---");
    System.out.println(System.currentTimeMillis()-start);
    
    // 2. 發牌
    
    // 3. 攤牌 + 理牌
  }

}

 

PokerV2.java

import java.util.Arrays;

public class PokerV2 {

  public static void main(String[] args) {
    //long start = System.currentTimeMillis();
    int[] poker = new int[52];
    for (int i=0; i<poker.length; i++) poker[i] = i;
    
    for (int i=poker.length; i>0; i--) {	// i = 52 ... 1
      int rand = (int)(Math.random()*i);	// rand = 0 ... 51
      // 交換 => last => i-1
      int temp = poker[rand];
      poker[rand] = poker[i-1];
      poker[i-1] = temp;
//			System.out.println(
//				"rand="+rand + "; poker[rand]="+poker[rand]+";poker[last]="+poker[i-1]);
    }
    //for (int v : poker) System.out.println(v);
    //System.out.println("---");
    //System.out.println(System.currentTimeMillis()-start);
    
    // 四個玩家, 各家13張牌
    int[][] players = new int[4][13];
    for (int i=0; i<poker.length; i++) {
      players[i%4][i/4] = poker[i];
    }
    
    String[] suits = {"黑桃","紅心","方塊","梅花"};
    String[] values = {"A ","2 ","3 ","4 ","5 ","6 ","7 ","8 ","9 ",
              "10","J ","Q ","K "};
    for (int[] player : players) {
      Arrays.sort(player);
      for (int card : player) {
        System.out.print(suits[card/13] + values[card%13] +" ");
      }
      System.out.println();
    }
  }
}

 

洗牌重要性


教學影片-12

 

 

 

 

 

本站資源一切隨緣,
不用註冊, 不看廣告
如果對您有所助益,
歡迎功德隨喜, 金額隨意,
請點擊以下...(感謝您)

功德箱/打賞箱

%d bloggers like this: