1. Sự khác biệc giữa mảng đa chiều và mảng một chiều

Thực sự nếu như mới bắt đầu và hiểu về mảng đa chiều ta có thể sẽ thấy hơi khó hiểu và hình dung ra nó. Vì vậy ta chỉ cần hiểu một cách đơn giản là mảng đa chiều là mảng nằm trong mảng. Tức là có ít nhất một mảng nằm trong một mảng là mảng 2 chiều, rồi có mảng 3 chiều, … Dữ liệu bên trong phần tử của một mảng chính là mảng.

Ví dụ sau đây là một mảng đa chiều mà chúng ta sẽ tìm hiểu:

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

Ở đây, a là một mảng hai chiều (mảng 2d). Mảng này có thể chứa tối đa 12 phần tử thuộc kiểu dữ liệu int.

Hãy nhớ rằng, Java sử dụng chỉ số gốc là 0, nghĩa là, chỉ số của các mảng trong Java bắt đầu bằng 0 chứ không phải bằng 1.

Tương tự, có thể khai báo một mảng ba chiều (mảng 3d) : String[][][] data = new String[3][4][2];

Và từ đó ta cũng có thể có một mảng n chiều và gọi chung là mảng đa chiều. Bản chất của mảng 2 chiều là mỗi dòng của nó chính là một mảng một chiều. Ví dụ: với mảng hai chiều a có 3 dòng, 5 cột, mỗi phần tử của mảng có kiểu int thì a được xem như mảng một chiều có 3 phần tử, mỗi phần tử này là một mảng một chiều có 5 phần tử.

Nhưng gần như ta chỉ sử dụng đến mảng 2 chiều và nhiều nhất là mảng 3 chiều. Nên trong các hướng dẫn về mảng đa chiều sau mình sẽ nói hướng dẫn chung về mảng 2 chiều nhé. Còn với các mảng khác thì các bạn có thể làm tương tự.

2. Khởi tạo một mảng đa chiều trong Java

Tương tự như khai báo mảng 1 chiều, cú pháp khai báo mảng đa chiều có 2 dạng như sau:

C1 : [Kiểu_dữ_liệu] Tên_mảng[][];

C2 : [Kiểu_dữ_liệu][][] Tên_mảng;

Trong đó

  • [Kiểu_dữ_liệu] mô tả kiểu của mỗi phần tử thuộc mảng (như int, char, double, String,…)
  • tên_mảng là tên của mảng và quy tắc đặt tên phải tuân theo quy tắc đặt tên biến trong Java

Sau khi đã khai báo ta phải khởi tạo nó. Bằng cách cấp phát bộ nhớ cho mảng với việc sử dụng từ khóa new . Trong đó [Số_dòng], [Số_cột]: là hai số nguyên dương chỉ ra số lượng dòng và số lượng cột của mảng hai chiều và trong Java có 2 cách để cấp phát bộ nhớ như sau:

C1 : [Kiểu_dữ_liệu] Tên_mảng[][] = new [Kiểu_dữ_liệu] [Số_dòng][Số_cột];

C2 : [Kiểu_dữ_liệu][][] Tên_mảng = new [Kiểu_dữ_liệu] [Số_dòng][Số_cột];

Lưu ý

Trong quá trình tạo mảng thì các phần tử trong từng hàng phải đặt trong một cặp dấu ngoặc xoắn và dùng dấu phẩy để phân cách. Ngoài ra các cặp ngoặc xoắn cũng được phân cách nhau bằng dấu phẩy

Ví dụ: khai báo và khởi tạo giá trị cho mảng đa chiều

public class Main {
    public static void main(String[] args){
        int b[][] = new int[3][3] ; // Khai báo và khởi tạo mảng hai chiều
        //Khai báo và khởi tạo giá trị cho mảng 2 chiều
        int a[][]={{1,2,3},
                   {3,4,5},
                   {6,4,5}};
        b = a ; // Gán giá trị mảng a cho mảng b
        // Duyệt qua các phần tử trong hàng
        for (int i=0;i<3;i++){
        	// Duyệt qua các phần tử trong cột
            for (int j=0;j<3;j++){
            	//Hiển thị phần tử tại hàng i, cột j trong mảng
                System.out.print(b[i][j] + " "); 
            }
            //Sau khi viết xong 1 hàng thi xuống hàng
            System.out.println();
        }
    }
}

Kết quả

1 2 3 
3 4 5 
6 4 5

3. Truy xuất các phần tử trong mảng đa chiều

Mỗi phần tử của mảng đa chiều được truy xuất thông qua tên mảng cùng với chỉ số dòng và chỉ số cột của phần tử đó. Tương tự như mảng một chiều, nếu một mảng đa chiều có m dòng và n cột thì chỉ số của dòng sẽ chạy từ 0, 1, 2,…, m – 1 và chỉ số của cột sẽ chạy từ 0, 1, 2,…, n – 1.

Cú pháp : Tên_mảng[Chỉ_số_dòng][Chỉ_số_cột]

Ví dụ:

public class Main {
 public static void main(String[] args) {
    // khai báo một mảng 2 chiều có 3 dòng và 2 cột
    int diem[][] = {{1, 2}, 
                    {3, 4}, 
                    {5, 6}};
         
    System.out.println("Phần tử nằm ở dòng 2 và cột 1 trong mảng diem là " + diem[2][1]);
 }
}

Kết quả

Phần tử nằm ở dòng 2 và cột 1 trong mảng diem là 6

4. Dùng vòng lặp xử lý và khởi tạo mảng đa chiều

Ta có thể sử dụng một vòng lặp for bên trong một vòng lặp for khác để lấy các phần tử của mảng đa chiều. Ở  đây chúng ta vẫn phải trỏ đến 2 chỉ mục

Ví dụ:

class Main {
   public static void main(String[] args) {
     int[][] myNumbers = { {1, 2, 3, 4}, {5, 6, 7} };
     for (int i = 0; i < myNumbers.length; ++i) {
        for(int j = 0; j < myNumbers[i].length; ++j) {
           System.out.print(myNumbers[i][j] + " ");
        }
        System.out.println();
     }
   }
}

Kết quả

1 2 3 4 
5 6 7

5. Giới thiệu về lớp Array trong Java

Lớp java.util.Arrays chứa nhiều phương thức static đa dạng để xếp thứ tự và tìm kiếm các mảng, so sánh các mảng và điền các phần tử vào mảng.

  • public static int binarySearch(Object[] a, Object key) : Tìm kiếm giá trị key trong mảng a[] và trả về chỉ mục của từ khóa tìm kiếm. Phương thức này tìm kiếm theo thuật toán tìm kiếm nhị phân, và mảng này phải được sắp xếp trước khi tìm bằng phương thức này
  • public static boolean equals(long[] a, long[] a2) Trả về giá trị true nếu a[] bằng mảng a2[]. Hai mảng được định nghĩa bằng nhau nếu như chúng có cùng số phần tử và các cặp phần tử tương ứng phải bằng nhau. Phương thức này có thể dùng cho tất cả kiểu dữ liệu gốc như int, char, sort…
  • public static void fill(int[] a, int val) : Gán giá trị val cho tất cả các phần tử của mảng. Phương thức này có thể dùng cho tất cả kiểu dữ liệu gốc như int, char, sort…
  • public static void sort(Object[] a) : Sắp xếp giá trị các phần tử của mảng theo thứ tự tăng dần. Phương thức này có thể dùng cho tất cả kiểu dữ liệu gốc như int, char, sort…