Java: Mảng hai chiều trong Java

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Khai báo, tạo thể hiện và khởi tạo mảng đa chiều

Ta cũng có thể tạo một mảng của các mảng, đó là mảng đa chiều. Loại mảng này được tạo bằng cách sử dụng hai hoặc nhiều cặp ngoặc vuông [], chẳng hạn như int[][] diem. Do đó, mỗi phần tử của mảng loại này phải được truy cập bằng cách sử dụng các chỉ số tương ứng với các chiều.

Ta có thể hiểu mảng đa chiều trong Java là loại mảng mà trong đó các phần tử chính là các mảng. Điều này cho phép các hàng có thể có các chiều dài khác nhau.

Cú pháp khai báo và tạo thể hiện cho mảng đa chiều có thể như sau:

kiểu_dữ_liệu[][] <tên_mảng> = new kiểu_dữ_liệu[số_hàng][số_cột];

trong đó, số_hàng và số_cột chỉ ra số lượng các hàng và các cột mà mảng sẽ chứa.

Ví dụ,

int[][] diem = new int[4][2];

Câu lệnh trên khai báo một mảng có tên diem là mảng hai chiều có kiểu int gồm bốn hàng và hai cột.

Ta cũng có hai cách khởi tạo mảng đa chiều giống như mảng một chiều. Các cách được trình bày như các ví dụ dưới đây.

Ví dụ thể hiện cho cách thứ nhất là cách khởi tạo các phần tử mảng ngay trong quá trình tạo mảng.

int[][] diem = { {23,65}, {42,47}, {60,75}, {75,50} };

Lưu ý rằng khi khởi tạo mảng trong quá trình tạo, thì các phần tử trong từng hàng được đặt trong một cặp 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.

Đây là mảng hai chiều được thể hiện theo dạng bảng như sơ đồ 8.4.

Ngôn ngữ C: Sơ đồ mảng hai chiều

Đoạn mã 1 thể hiện cách thứ hai là khởi tạo sau khi tạo mảng và tạo thể hiện của mảng.

Đoạn mã 1:

int[][] diem = new int[4][2];
diem[0][0] = 12; // hàng 1, cột 1
diem[0][1] = 34; // hàng 1, cột 2
diem[1][0] = 56;
diem[1][1] = 78;
diem[2][0] = 90;
diem[2][1] = 12;
diem[3][0] = 34;
diem[3][1] = 56;

Theo cách này, phần tử có giá trị 78 là phần tử có vị trí (1,1). Do vậy, để lưu trữ hay truy cập phần tử 78 thì ta phải sử dụng cú pháp là diem[1][1]. Lưu ý là chỉ số hàng và chỉ số cột đều bắt đầu bằng là 0.

Đoạn mã 2 thể hiện một ví dụ về mảng hai chiều.

Đoạn mã 2:

public class TwoDimension {
  //Khai báo mảng 2 chiều có tên marks
  int marks[][]; //line 1
  /* Phương thức này thực hiện việc lưu dữ liệu vào mảng marks */
  public void storeMarks() {
    //Khởi tạo mảng
    marks = new int[4][2]; // line 2
    System.out.println("Storing Marks. Please wait...");
    //Khởi tạo các phần tử mảng
    marks[0][0] = 23; // line 3
    marks[0][1] = 65;
    marks[1][0] = 42;
    marks[1][1] = 47;
    marks[2][0] = 60;
    marks[2][1] = 75;
    marks[3][0] = 75;
    marks[3][1] = 50;
  }
  /* Phương thức này sẽ hiển thị dữ liệu của mảng marks */
  public void displayMarks() {
    System.out.println("Marks are:");
    System.out.println("Roll no.1: " + marks[0][0]+ ", " + marks[0][1]);
    System.out.println("Roll no.2: " + marks[1][0]+ ", " + marks[1][1]);
    System.out.println("Roll no.3: " + marks[2][0]+ ", " + marks[2][1]);
    System.out.println("Roll no.4: " + marks[3][0]+ ", " + marks[3][1]);
  }
  public static void main(String[] args) {
    //Khởi tạo lớp TwoDimension
    TwoDimension twoDimenObj = new TwoDimension(); // line 4
    //Gọi phương thức storeMarks()
    twoDimenObj.storeMarks();
    //Gọi phương thức displayMarks()
    twoDimenObj.displayMarks();
  }
}

Lớp TwoDimension bao gồm một mảng có tên marks[][] được khai báo ở line 1. Để tạo thể hiện và khởi tạo các phần tử mảng, phương thức storeMarks() được tạo.

Thể hiện của mảng được tạo bàng từ khóa new ở line 2. Các phần tử của mảng được gán các giá trị bằng cách sử dụng tên mảng và cặp chỉ số hàng và cột của từng phần tử, đó là marks[0][0]. Tương tự như vậy, để hiển thị các phần tử mảng thì phương thức displayMarks() được tạo và được gọi và các giá trị được lưu trong mỗi phần tử của mảng marks[][] được hiển thị.

Đối tượng twoDimenObj của lớp TwoDimension được tạo ở line 4. Nó được sử dụng để gọi phương thức storeMarks() và displayMarks().

Hình sau đây thể hiện output của đoạn mã trên, đó là điểm của 4 sinh viên được hiển thị lấy từ mảng marks[][].

Output của mảng hai chiều (Two Dimension Array)

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

Đoạn mã 3 minh họa phương thức displayMarks() đã sửa đổi của mảng hai chiều marks[][].

Đoạn mã 3:

...
public void displayMarks(){
  System.out.println(“Marks are:”);
  // Display the marks using nested for loop
  // outer loop

  for (int row = 0; row < marks.length; row++) {
    System.out.println(“Roll no.” + (row+1));
    // inner loop
    for (int col = 0; col < marks[row].length; col++) {
      System.out.println(marks[row][col]);
    }
  }
}
...

Trong đoạn mã trên, một vòng lặp for lồng (outer và inner) đươc dùng để lặp qua các phần tử của mảng marks. Vòng lặp for ngoài sẽ lấy từng hàng và vòng lặp for trong sẽ lấy từng cột của mỗi hàng. Với mỗi hàng thì vòng lặp trong sẽ lặp qua tất cả các cột bằng cách sử dụng marks[hàng].length. Tại vòng lặp for trong thì từng phần tử được hiển thị với các chỉ số hàng và cột tương tứng thông qua các biến row và col, đó là marks[row][col].

Hình sau thể hiện output của mảng hai chiều marks[][] sau khi sử dụng vòng lặp for lồng.

Ngôn ngữ C: output của mảng marks dùng vòng lặp for lồng

Đoạn mã 4 thể hiện việc tính tổng điểm cho từng sinh viên bằng cách sử dụng kết hợp vòng lặp for thường và for cải tiến đối với mảng hai chiều marks[][].

Đoạn mã 4:

...
public void totalMarks() {
  System.out.println(“Total Marks are:”);
  // dùng for thường kết hợp for cải tiến
  for (int row = 0; row < marks.length; row++) {
    System.out.println(“Roll no.” + (row+1));
    int sum = 0;
    // for cải tiến
    for(int value:marks[row]) {
      sum = sum + value;
    }
    System.out.println(sum);
  }
}
...

Ở đây, vòng lặp for cải tiến được dùng để lấy giá trị của từng phần tử của mỗi hàng rồi cộng dồn vào biến sum. Chỉ số của từng hàng được thể hiện thông qua biến row của vòng lặp for ngoài.

Hình dưới đây thể hiện tổng các giá trị của mảng hai chiều marks[][] bằng cách sử dụng đoạn mã 4 trên sử dụng kết hợp vòng lặp for lồng và for cải tiến.

Ngôn ngữ C: kết hợp for thường và for cải tiến

» Tiếp: Bài tập phần mảng số
« Trước: Mảng một chiều trong Java
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!