Java 多維陣列

多維陣列是「陣列的陣列」,最常用的是二維陣列。

宣告二維陣列

// 方式一:指定大小
int[][] matrix = new int[3][4];  // 3 列 4 行

// 方式二:直接初始化
int[][] matrix2 = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

// 方式三:使用 new 並初始化
int[][] matrix3 = new int[][]{{1, 2}, {3, 4}, {5, 6}};

存取元素

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

// 讀取:matrix[列][行]
System.out.println(matrix[0][0]);  // 1
System.out.println(matrix[1][2]);  // 6
System.out.println(matrix[2][1]);  // 8

// 修改
matrix[0][0] = 100;

陣列大小

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6}
};

System.out.println(matrix.length);     // 2(列數)
System.out.println(matrix[0].length);  // 3(第一列的行數)

遍歷二維陣列

for 迴圈

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        System.out.print(matrix[i][j] + " ");
    }
    System.out.println();
}

for-each 迴圈

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6}
};

for (int[] row : matrix) {
    for (int num : row) {
        System.out.print(num + " ");
    }
    System.out.println();
}

不規則陣列

每一列可以有不同的長度:

int[][] jagged = new int[3][];
jagged[0] = new int[2];  // 第一列 2 個元素
jagged[1] = new int[4];  // 第二列 4 個元素
jagged[2] = new int[3];  // 第三列 3 個元素

// 或直接初始化
int[][] jagged2 = {
    {1, 2},
    {3, 4, 5, 6},
    {7, 8, 9}
};

實際應用

計算總和

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6}
};

int sum = 0;
for (int[] row : matrix) {
    for (int num : row) {
        sum += num;
    }
}
System.out.println("總和:" + sum);  // 21

轉置矩陣

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6}
};

int rows = matrix.length;
int cols = matrix[0].length;
int[][] transposed = new int[cols][rows];

for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
        transposed[j][i] = matrix[i][j];
    }
}
// transposed = {{1, 4}, {2, 5}, {3, 6}}

矩陣相加

int[][] a = {{1, 2}, {3, 4}};
int[][] b = {{5, 6}, {7, 8}};
int[][] result = new int[2][2];

for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
        result[i][j] = a[i][j] + b[i][j];
    }
}
// result = {{6, 8}, {10, 12}}

搜尋元素

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
int target = 5;

search:
for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        if (matrix[i][j] == target) {
            System.out.println("位置:[" + i + "][" + j + "]");
            break search;
        }
    }
}

井字遊戲棋盤

char[][] board = {
    {' ', ' ', ' '},
    {' ', ' ', ' '},
    {' ', ' ', ' '}
};

// 下棋
board[0][0] = 'X';
board[1][1] = 'O';
board[0][2] = 'X';

// 印出棋盤
for (int i = 0; i < 3; i++) {
    System.out.println(" " + board[i][0] + " | " + board[i][1] + " | " + board[i][2]);
    if (i < 2) System.out.println("-----------");
}

三維陣列

int[][][] cube = new int[2][3][4];

// 初始化
int[][][] cube2 = {
    {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    },
    {
        {13, 14, 15, 16},
        {17, 18, 19, 20},
        {21, 22, 23, 24}
    }
};

// 存取
System.out.println(cube2[0][1][2]);  // 7

Arrays 工具方法

import java.util.Arrays;

int[][] matrix = {{3, 1, 2}, {6, 4, 5}};

// 轉字串
System.out.println(Arrays.deepToString(matrix));
// [[3, 1, 2], [6, 4, 5]]

// 比較
int[][] matrix2 = {{3, 1, 2}, {6, 4, 5}};
System.out.println(Arrays.deepEquals(matrix, matrix2));  // true