第27節 - Java: Array, Arrays, List, ArrayList & LibGDX: Array
這一節我會介紹Java的Array(陣列), Arrays, List, ArrayList和LibGDX的Array,它們看起來十分相似,但其實各有不同,我會在這節詳細介紹。
為甚麼要學Array?
首先Array不只是Java程式語言獨有的類別,所有程式語言(物件導向或非物件導向)都會用到Array。
另外因為我們將會在第29節 - LibGDX: Game Level Selection Screen運用LibGDX的Array來存取圖片,所以我們必須明白Array的用法。
以下收錄了Java Array, Arrays, List, ArrayList和LibGDX Array的主要用法,我會詳細解釋:

Java Array的種類
首先Array分為1D, 2D, 3D, 4D, 5D...到無限個D(nD),雖然Java程式語言沒有限制維數(Dimenions),但是Java的VM(Virtual Machine)限制維數為255,所以Java Array分為1D, 2D, 3D...255D,除了以上的Array的種類,還有一種叫不規則Array。
- 1D: array[]
- 2D: array[][]
- 3D: array[][][]
- 4D....nD
- 不規則Array
Java-1D Array

- 建立一個1D Array a[],並初始化row=1,column=10,預設值為零。
- 如果沒有設定初始值,預設值為零。
- Array index(索引)由a[0]至a[9]。
- 我們可以用a.length物件變數來取得Array的元素數目為10。
- 因為沒有設定初始值,所以所有Array元素值都是零 (a[0]=0, a[1]=0,......a[9]=0)。
Java - 2D Array

- 建立一個2D Array a[][],並初始化row=3和column=4,預設值為零。
- 如果沒有設定初始值,預設值為零。
Java - 3D Array


- 建立一個3D Array a[][][],並初始化row=2,column=3,和page/plane=4,預設值為零。
- 如果沒有設定初始值,預設值為零。
Java - 規則Array和不規則Array
Java的Array也可以分為規則Array和不規則Array:
規則Array:
- 每一row的元素數目都是一樣。
不規則Array:
- 每一row的元素數目都不一樣。
- 子元素也是陣列,所以又稱「陣列中的陣列」。
以上所介紹的都是規則Array,則是每一行的元素數目都是一樣,例如int a[][]=new int[3][4]; 就代表有三行陣列,每行陣列就有四個元素:
- a[0] = new int[] {1,2,3,4};
- a[1] = new int[] {5,6,7,8 };
- a[2] = new int[] {9,10,11,12};
而不規則Array,每行陣列就可以有不同數目的的元素,例如:
- a[0] = new int[] {1,2,3,4,5};
- a[1] = new int[] {6,7,8,9};
- a[2] = new int[] {10,11};
第一row具有五個元素,第二row具有五個元素,而第三row就具有五個元素。
Java Collections Framework
Collection是集合,有是也稱為Container(容器),它是一個抽象設計方式,它可儲存、取用或操作資料,或把資料從一個地方傳遞到另一地方。而Sun公司再建立一個Java Collections Framework,它把Collection介面和其他介面統一起來。
Java JDK 1.6版的Java Collections Framework就包括以下圖片的不同介面,而其中Collection介面和Map介面就是主要的兩個繼承族譜。
我們只要明白小小關於Java Collections Framwork, Collection介面,List介面,ArrayList類別,Map介面和平Arrays的關係就足夠,如果將來要用到Java Collections Framwork來寫我們的LibGDX遊戲,我會再詳細介紹。

- Collection介面下就繼承了List介面。
- ArrayList類別就實作了List介面。
- Arrays類別就繼承了Object類別。
1) Java Array例子1 - Create an Array

- 建立一個1D Array a[],並初始化row=1,column=10,預設值為零。
- 用for-loop由i=0到i=a.length,把Array a[]的十個元素列印出來,我們可以用a.length物件變數來取得Array的元素數目為10。
- 顯示結果,因為沒有設定初始值,預設值為零。
2) Java Array例子2 - initialize an Array

- 建立一個1D Array a[],並初始化row=1,column=10,把1至10儲存在a[]上。
- 用for-loop由i=0到i=a.length,把Array a[]的十個元素列印出來,我們可以用a.length物件變數來取得Array的元素數目為10。
- 顯示結果。
3) Java Array例子3 - initialize an Array without "new"

- 建立一個1D Array a[],但new可以忽略,並初始化row=1,column=10,把1至10儲存在a[]上。
- 用for-loop由i=0到i=a.length,把Array a[]的十個元素列印出來,我們可以用a.length物件變數來取得Array的元素數目為10。
- 顯示結果。
4) Java Array例子4 - for-loop Statement

- 建立一個1D Array a[],但new可以忽略,並初始化row=1,column=10,把1至10儲存在a[]上。
- 這次用另一個for-loop,for(int arrayA: a),建立一個int Array變數(arrayA),它把a[]的所有元素列印出來。
- 顯示結果。
5) Java Arrays例子1 - Arrays.sort()類別方法

- 建立一個1D Array a[],但new可以忽略,並初始化row=1,column=10,把1至10儲存在a[]上。
- 用for-loop,for(int arrayA: a),把a[]的所有元素列印出來。
- 用Arrays.sort()方法,把Array的元素排序,最後顯示結果。
6) Java Arrays例子2 - Arrays.fill()類別方法

- 建立一個1D Array a[],但new可以忽略,並初始化row=1,column=10,把1至10儲存在a[]上。
- 用for-loop,for(int arrayA: a),把a[]的所有元素列印出來。
- 用Arrays.fill()方法,把Array的元素儲存為"5",最後顯示結果。
7) Java Arrays例子3 - Arrays.toSpring()類別方法

- 建立一個1D Array a[],但new可以忽略,並初始化row=1,column=10,把1至10儲存在a[]上。
- 用for-loop,for(int arrayA: a),把a[]的所有元素列印出來。
- 用Arrays.toString()方法,把Array的元素儲存為字串stringA,最後顯示結果。
8) Java Arrays例子4 - Arrays.add(), Arrays.size()和Arrays.get()類別方法

- 建立一個Integer類別的ArrayList物件(arrayAs)。
注意,int是否Java的primitive type,而Integer是Java的類別,所以我們可以利用ArrayList類別產生一個帶有Integer類別元素的物件arrayAs。 - 用ArrayList的add()方法,加入5個元素(1至5)。
- 用Arrays.size()方法,顯示arrayAs的元素數目。
- 用for-loop,for(int i=0; i<arrayAs.size(); i++),再用arrayAs.get()方法把arrayAs的所有元素儲存到value變數上,最後顯示結果。
9) Java ArrayList例子1 - indexOf()和LastIndexOf()物件方法

- 建立一個Integer類別的ArrayList物件(arrayAs)。
注意,int是否Java的primitive type,而Integer是Java的類別,所以我們可以利用ArrayList類別產生一個帶有Integer類別元素的物件arrayAs。 - 用ArrayList的add()方法,加入9個元素(1,1,2,3,3,4,3,5,2)。
- 用indexOf(2)方法,顯示第一次出現"2"的元素。
注意,indexOf(2)是第3個元素,不是第2個元素,因為由"0"開始計算(0,1,2)。
用lastIndexOf()方法,顯示最後一次出現包括"3"的元素。
- 最後顯示結果。
10) Java ArrayList例子2 - clear()和isEmpty()物件方法

- 建立一個Integer類別的ArrayList物件(arrayAs)。
注意,int是否Java的primitive type,而Integer是Java的類別,所以我們可以利用ArrayList類別產生一個帶有Integer類別元素的物件arrayAs。 - 用ArrayList的add()方法,加入1個元素"1",再用ArrayList的isEmpty()方法回傳一個人boolean值,因為我們加入了1個元素"1",所以isEmpty()回傳的值是否false。
- 用ArrayList的clear()方法,清除ArrayList物件(arrayAs),所以isEmpty()回傳的值是否true,
最後顯示結果。
11) Java ArrayList例子3 - toArray()物件方法

- 建立一個Integer類別的ArrayList物件(arrayAs)。
注意,int是否Java的primitive type,而Integer是Java的類別,所以我們可以利用ArrayList類別產生一個帶有Integer類別元素的物件arrayAs。 - 用ArrayList的add()方法,加入9個元素(1,2,3,4,5)。
- 用ArrayList的toArray()方法,把ArrayAs的元素複製到ArrayBs,最後顯示結果。
12) Java ArrayList例子4 - Create an ArrayList Object

- ArrayList其中一種好處就是除了可以傳入預設的primitive type變數,還可以傳入一個自定的類別(例子:Programmer類別)。
- 用ArrayList的add()方法,加入value=1, name="Peter"和value=2, name="Mary"。
- 用for-loop,for(Programmer p: arrayAs),把arrayAS的所有元素列印出來。
注意,System.out.println(p) = System.out.println(p.toString()),因為System.out.println()方法預設用 toString()方法顯示結果。
13) LibGDX Array例子1 - Texture類別
我在第12節 - LibGDX: Texture, TextureRegion, SpriteBatch & Sprite介紹過Texture和TextureRegion的分別。
以下例子用第18節 - LibGDX: Texture Packer制作一個numbers.pack和numbers.png檔案,如下圖:


- 把一張levelscreen.png圖片傳入assets/內。
- 用Texture產生一個Texture物件(texture)然後把圖片(levelscreen.png)傳入
- 在Render()內運用batch.begin(),batch.draw()和batch.end()來繪製texture物件顯示在屏幕上。
要把Texture圖片移位,我們可以用batch.draw()的簡單版,第2和第3個參數就是用來設定Texture左下角在World Coordinate的位置(x,y)。因為我們的levelscreen.png是500X700px,所以只要把texture左移"500/2" px,下移"700/2"px(i.e. -500/2,-700/2)就可以完成圖片至中的效果。
程式執行結果如下(這例子的程式碼和圖片可以在本節尾部下載):

14) LibGDX Array例子2- TextureRegion類別

- 用Texture產生一個Texture物件(texture)然後把圖片(levelscreen.png)傳入。
- 用TextureRegion產生一個TextureRegion物件(textureRegion)然後把texture物件傳入,再設定區域位置和大小。
- 在Render()內運用batch.begin(),batch.draw()和batch.end()來繪製texture物件顯示在屏幕上。
程式執行結果如下(這例子的程式碼和圖片可以在本節尾部下載):

15) LibGDX Array例子3 - TextureAtlas類別和findRegion()方法

- 用TextureAtlas類別產生一個TextureAtlas物件(atlas)然後把圖片(numbers.pack)傳入。
- 用TextureRegion的findRegion()方法把 "picture1", "picture2", "picture3", "picture4" 和"picture5"傳入TextureRegion物件。
注意,findRegion()方法是TextureRegion類別的方法,因為TextureAtlas類別是繼承int是TextureRegion類別,所以也可以用findRegion()方法。 - 在Render()內運用batch.begin(),batch.draw()和batch.end()來繪製textureRegion物件顯示在屏幕上。
程式執行結果如下(這例子的程式碼和圖片可以在本節尾部下載):

16) LibGDX Array例子4 - TextureAtlas類別,findRegion()方法和TextureRegion[] Array

- 用TextureAtlas類別產生一個TextureAtlas物件(atlas)然後把圖片(numbers.pack)傳入。
- 用TextureRegion的findRegion()方法把 "picture1", "picture2", "picture3", "picture4" 和"picture5"傳入傳入TextureRegion Array。
注意,findRegion()方法是TextureRegion類別的方法,因為TextureAtlas類別是繼承int是TextureRegion類別,所以也可以用findRegion()方法。 - 在Render()內運用batch.begin(),batch.draw()和batch.end()來繪製textureRegion Array顯示在屏幕上。
程式執行結果如下(這例子的程式碼和圖片可以在本節尾部下載):

17) LibGDX Array例子5 - Create an Array
物件和getRegions()方法

- 用TextureAtlas類別產生一個TextureAtlas物件(atlas)然後把圖片(numbers.pack)傳入。
- 建立一個AtlasRegion類別的Array物件(atlasArrays), 用TextureAtlas類別的getRegions()方法把 "picture1", "picture2", "picture3", "picture4" 和"picture5"傳入atlasArrays。
- 用Array的get()方法把 "picture1", "picture2", "picture3", "picture4" 和"picture5"傳入傳入TextureRegion Array。
- 在Render()內運用batch.begin(),batch.draw()和batch.end()來繪製textureRegion Array顯示在屏幕上。
程式執行結果如下(這例子的程式碼和圖片可以在本節尾部下載):
