二維陣列
二維陣列,就是一維陣列的值,是一維陣列,也就是一維陣列包著多個一維陣列。
二維陣列是由多個一維陣列所組成的。
宣告
有以下三種方式。
類別[][] 變數;
類別 變數[][];
類別[] 變數[];
預設值
- 若為基本型態,初始值為基本型態預設值。
- 若為類別或陣列,預設值為null。
基本型態 | 預設值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0f |
double | 0.0 |
char | \u0000 |
boolean | false |
建立陣列大小
類別[][] 變數 = new 類別[大小][大小];
注意!大小設定之後,就不能再修改陣列的大小。
2維陣列大小可以不用填,之後再手動分配大小。
類別[][] 變數 = new 類別[大小][];
注意!大小是從1開始,外圍陣列至少要有1個大小。
類別[][] 變數 = new 類別[1][];
以下是錯誤寫法,大小不可為0,大小不是陣列索引。
類別[][] 變數 = new 類別[0][0];
初始值
類別[][] 變數 = { {值1, 值2, 值3}, {值1, 值2, 值3} };
程式碼
1
2
3
4
5
6
7
8
9
10
// 宣告
int[][] arr1;
int arr2[][];
// 建立陣列,分配陣列大小
arr1 = new int[2][3];
arr2 = new int[3][];
// 宣告與建立陣列,只分配1維陣列大小,2維陣列大小沒分配
int[] arr3[] = new int[2][];
// 宣告與初始值建立陣列
int[] arr4[] = { {1, 2, 3}, {4, 5, 6} };
行列
台灣的row是列。
台灣的column是行。
台灣的列row橫向,行column是直向。
大陸的行與列與台灣的是顛倒。
二維陣列[row][column] = 值;
二維陣列[列][行] = 值;
二維陣列[2][3] = 1;
索引範圍
索引範圍是0..(大小 - 1), 0 <= i <= (大小 - 1)
1
int[] arr3[] = new int[2][3];
外圍的1維索引範圍為0..(2-1), 0 <= i <= 1。
裡面的1維索引範圍為0..(3-1), 0 <= i <= 2。
1
2
3
4
5
6
7
8
9
int[] arr3[] = new int[2][3];
// 外圍1維陣列索引0與1
// 裡面1維陣列索引0,1,2
arr3[0][0] = 1;
arr3[0][1] = 2;
arr3[0][2] = 3;
arr3[1][0] = 4;
arr3[1][1] = 5;
arr3[1][2] = 6;
2維陣列的值只能為1維陣列
以下的程式碼將編譯錯誤,因為100不是1維陣列。
1
int[] arr4[] = { {1, 2, 3}, 100};
迴圈
因為int基本型態預設值為0,印出的值為0。
二維陣列就像棋盤一樣擺放。
1
2
3
4
5
6
7
8
9
10
11
int[][] arr1 = new int[2][3];
// i的範圍介於0 .. 1 , 0 <= i <= 1,i包含1
for (int i = 0; i < arr1.length; i++) {
// j的範圍介於0 .. 2, 0 <= j <= 2,j包含2
for (int j = 0; j < arr1[i].length; j++) {
System.out.print("[" + i + "][" + j + "]= "
+ arr1[i][j] + "\t");
}
// 斷行
System.out.println();
}
[0][0]= 0 [0][1]= 0 [0][2]= 0
[1][0]= 0 [1][1]= 0 [1][2]= 0
Memory model
陣列存的是1維陣列的記憶體位址。
基本型態預設值
基本型態 | 預設值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0f |
double | 0.0 |
char | \u0000 |
boolean | false |
boolean預設值為false
1
2
3
4
5
6
boolean[][] arr1 = new boolean[2][3];
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
System.out.println("[" + i + "][" + j + "]= " + arr1[i][j]);
}
}
[0][0]= false
[0][1]= false
[0][2]= false
[1][0]= false
[1][1]= false
[1][2]= false
1
2
3
4
5
6
char[][] arr1 = new char[2][3];
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
System.out.println("[" + i + "][" + j + "]= " + arr1[i][j]);
}
}
二維陣列的大小可以不相同
1
2
3
4
5
int[][] arr1 = new int[2][];
// 索引0的一維陣列大小為2
arr1[0] = new int[2];
// 索引1的一維陣列大小為5
arr1[1] = new int[5];
以下的程式碼不會有任何問題,arr4[2]的大小為1個。
1
int[] arr4[] = { {1, 2, 3}, {4, 5, 6}, {100} };
但以下程式碼會編譯錯誤,因為值一定要為一維陣列。
1
int[] arr4[] = { {1, 2, 3}, {4, 5, 6}, 100 };
手動分配大小
1
2
3
4
5
6
7
8
9
10
11
int[][] arr1 = new int[3][];
for (int i = 0; i < arr1.length; i++) {
// 根據 i 的值來分配大小,大小最少要有1個,所以用i+1
arr1[i] = new int[i + 1];
for (int j = 0; j < arr1[i].length; j++) {
System.out.print("[" + i + "][" + j + "]= "
+ arr1[i][j] + "\t");
}
// 斷行
System.out.println();
}
[0][0]= 0
[1][0]= 0 [1][1]= 0
[2][0]= 0 [2][1]= 0 [2][2]= 0
Pascal’s Triangle
以下是大小不一致的二維陣列。
1
11
121
1331
14641
- 二維陣列大小不一致,使用
new int[4][]
- 每一列row的索引
[0]
與索引最末尾[len - 1]
都為1。 - 每一列row的索引不為0與len-1,它的值是「上一列的前一行column」與「上一列的本身的同行column」的值相加。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int[][] arr1 = new int[4][];
for (int i = 0; i < arr1.length; i++) {
// 根據 i 的值來分配大小,大小最少要有1個,所以用i+1
arr1[i] = new int[i + 1];
for (int j = 0; j < arr1[i].length; j++) {
// 索引[0]與索引最末尾[len - 1]都為1
if (j == 0 || j == arr1[i].length - 1) {
arr1[i][j] = 1;
} else {
// 它的值是「上一列的前一行」與「上一列的本身的同行」的值相加
arr1[i][j] = arr1[i - 1][j] + arr1[i - 1][j - 1];
}
System.out.print(arr1[i][j] + "\t");
}
// 斷行
System.out.println();
}
1
1 1
1 2 1
1 3 3 1
易混淆的宣告
以下程式碼,arr1是一維陣列,arr2是二維陣列。
1
int[] arr1,arr2[];
假設arr1與arr2都已經建立陣列並設定大小,以下程式碼都是編譯錯誤。
1
2
3
arr1[0] = arr2;
arr2[0][0] = arr1;
arr1 = arr2;