CodeGym /課程 /JAVA 25 SELF /二維陣列

二維陣列

JAVA 25 SELF
等級 7 , 課堂 3
開放

1. 介紹

把一維陣列想像成一個長長的披薩盒,所有切片排成一列——好吃,但有點單調。

再想像一下行程表或西洋棋棋盤。其中一切都被組織成 ——也就是一個 表格。這正是二維陣列的經典任務。

在真實世界中,二維陣列隨處可見:

  • 員工薪資表(列=員工,欄=月份)。
  • 螢幕上的圖片(每個「格子」是像素顏色,具有兩個座標:X 與 Y)。
  • 矩陣運算與資料處理。
  • 西洋棋棋盤或井字遊戲的棋盤。

有時二維陣列也被稱為 矩陣(這個名稱來自數學)。

身為程式設計師,你會在許多地方需要二維陣列。幾乎任何桌上遊戲的實作,都是現成的二維陣列:「西洋棋」、「跳棋」、「井字遊戲」、「海戰棋」:

二維陣列 2

像「西洋棋」或「海戰棋」的棋盤,天生就對應二維陣列,格子的座標只需使用數字即可。不是「兵 e2 ⟶ e4」,而是「兵 (4,1) ⟶ (4,3)」。對程式設計師來說反而更簡單。

2. 二維陣列的宣告語法

在第一次宣告之前看起來有點可怕!我們一步一步來。

一般規則


type[][] arrayName;
在 Java 中宣告二維陣列

這裡有兩組空的 [] 方括號——不是編譯器熬夜喝咖啡後的失誤,而是用來表示:這是二維

範例

int[][] matrix;
double[][] gradesTable;
string[][] chessBoard;

建立陣列

先指定大小: 的數量與 的數量。

matrix = new int[3][4]; // 3 列,4 欄

這是一個 3×4 的小表格:想像成一張有 3 列與 4 欄的 Excel 表。

也可以同時宣告變數並建立二維陣列:

int[][] matrix = new int[3][4];

也可以直接用值初始化(和一維陣列很像):

int[][] example = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
// 表格 3 列、3 欄
用值初始化二維陣列

視覺示意

┌─────┬─────┬─────┬─────┐
│  0  │  1  │  2  │  3  │  ← 欄 (Columns)
├─────┼─────┼─────┼─────┤
│ 0,0 │ 0,1 │ 0,2 │ 0,3 │  ← 第 0 列 (Row 0)
├─────┼─────┼─────┼─────┤
│ 1,0 │ 1,1 │ 1,2 │ 1,3 │  ← 第 1 列 (Row 1)
├─────┼─────┼─────┼─────┤
│ 2,0 │ 2,1 │ 2,2 │ 2,3 │  ← 第 2 列 (Row 2)
└─────┴─────┴─────┴─────┘

每個元素由一對索引 [row, column] 指定。

3. 索引與元素存取

在二維陣列中,存取元素需要提供 兩個索引

  • 第一個——列索引。
  • 第二個——欄索引。

      // 在第 2 列(索引 1)、第 3 欄(索引 2)
      matrix[1][2] = 99;
為二維陣列的元素賦值

提醒一下:索引從零開始。也就是說,第一個元素是 [0][0]

寫入與讀取

int[][] data = new int[5][2];
data[1][1] = 5;         // 寫入
int value = data[1][1]; // 讀取

在記憶體中的樣子如下:

二維陣列

4. 填充二維陣列

我們來寫段程式碼,把矩陣用從 112 的連續數字填滿,好更直觀地了解它如何運作。

int[][] matrix = new int[3][4];
int value = 1;

for (int row = 0; row < 3; row++)
{
    for (int col = 0; col < 4; col++)
    {
        matrix[row][col] = value;
        value++;
    }
}
按順序填充二維陣列

示意:

執行後:
┌────┬────┬────┬────┐
│ 1  │ 2  │ 3  │ 4  │
├────┼────┼────┼────┤
│ 5  │ 6  │ 7  │ 8  │
├────┼────┼────┼────┤
│ 9  │ 10 │ 11 │ 12 │
└────┴────┴────┴────┘

5. 二維陣列的內部結構

接下來你將看到二維陣列真正的樣貌。準備好了嗎?

二維陣列其實是陣列的陣列!

換句話說,一維陣列是「變數(陣列)持有指向裝著陣列元素的容器的參考」;而對二維陣列來說,情況更進一步:二維陣列變數持有對一個容器的參考,而那個容器的每個格子又存放指向一維陣列的參考。看圖比解釋一百次還清楚:

二維陣列的內部結構

左邊是「二維陣列變數」,它持有指向「二維陣列物件」的參考。中間是「二維陣列物件」,其格子中存放著一維陣列(也就是二維陣列的各列)的參考。而在右邊你會看到四個一維陣列——我們的二維陣列的各列。

這就是二維陣列的真實結構。這種做法給 Java 開發者帶來幾個優勢:

首先,因為「容器的容器」存的是「列陣列」的參考,我們可以非常快速且簡單地對調列。若要存取「容器的容器」,只要提供一個索引即可。範例:

int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];

用下面這段程式碼可以把列互換:

// 重要資料的矩陣
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {5, 4, 3, 2, 1}
};

int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;

如果在存取二維陣列時,在陣列名後只寫一個索引,你取到的是外層容器,其格子中放的是一般一維陣列(各列)的參考。

6. 將二維陣列輸出到畫面

要把二維表格輸出到主控台,通常會使用巢狀迴圈——就像在主控台裡畫迷宮。範例:

for (int row = 0; row < matrix.length; row++) 
{
    for (int col = 0; col < matrix[row].length; col++) 
    {
        System.out.print(matrix[row][col] + "\t"); 
    }
    System.out.println(); // 換到新的一行
}

輸出範例:

1	2	3	4	
5	6	7	8	
9	10	11	12	

順帶一提,你現在已經學會只用幾行程式碼就能漂亮地「畫」出表格了!

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION