Điều gì nếu có cách bạn có thể khai báo một biến lưu nhiều giá trị? Có đấy? Tuyệt vời. Trong Java, có khái niệm mảng (array) cho phép bạn làm chính xác điều này. Bạn có thể lưu nhiều giá trị trong một biến, giúp mã gọn gàng và ngăn nắp.
Trong hướng dẫn này, chúng ta sẽ thảo luận cách mảng hoạt động, tại sao chúng được dùng, và cách thao tác nội dung mảng. Chúng ta sẽ đi qua vài ví dụ để chỉ cách chúng hoạt động.
Mảng (Array) là gì?
Mảng, còn gọi là danh sách (list), là cấu trúc dữ liệu chứa chuỗi thứ tự các phần tử. Bạn có thể lưu không hoặc nhiều mục trong mảng, nhưng tất cả phải cùng kiểu. Ví dụ, mảng có thể lưu một trăm chuỗi hoặc năm mươi hai số.
Mảng hữu ích vì giúp nhóm các giá trị tương tự. Giả sử bạn định nghĩa mảng các loại cà phê. Thay vì khai báo mỗi loại cà phê làm biến riêng, bạn có thể nhóm chúng trong mảng.
Một khi đã khai báo mảng, bạn có thể thực hiện cùng phương thức và thao tác trên mọi giá trị trong mảng bằng cách lặp qua nó.
Cách nghĩ về mảng là như tập hợp giá trị. Bạn biết danh sách việc cần làm hôm nay? Đó tương tự mảng. Có danh sách nhiệm vụ cần hoàn thành, mỗi cái lưu theo thứ tự cụ thể.
Khai báo mảng (Declaring an Array)
Khai báo mảng trong Java đơn giản. Chỉ cần chọn tên cho mảng và chỉ định kiểu dữ liệu. Đây là ví dụ khai báo mảng tên coffees:
String[] coffees;
Mã tạo mảng tên coffees. Bên trái, bạn có kiểu dữ liệu sẽ lưu trong mảng. Bạn cũng có cặp ngoặc vuông rỗng. Điều này báo mã bạn muốn định nghĩa mảng, không chỉ biến chuỗi. Bên phải, bạn có tên biến.
Chúng ta chưa xong. Khi khai báo mảng, bạn phải báo chương trình biết mảng muốn chứa bao nhiêu mục. Điều này cho phép Java cấp phát bộ nhớ cần thiết lưu giá trị trong mảng.
Chúng ta muốn mảng coffees lưu ba loại pha chế yêu thích tại tiệm địa phương. Để làm điều này, chúng ta báo chương trình số phần tử mảng nên chứa là ba:
coffees = new String[3];
Điều này tạo ba giá trị rỗng có thể điền vào mảng.
Hãy chắc chắn bạn nghĩ về số giá trị muốn lưu trong mảng. Quan trọng lưu ý rằng một khi đã định nghĩa kích thước biến mảng, không thể thay đổi.
Chúng ta nén mã thành một dòng vừa khai báo mảng vừa cấp phát bộ nhớ:
String[] coffees = new String[4];
Đây là cách tốt nhất khai báo mảng vì súc tích và đơn giản. Cơ hội duy nhất cách này không hoạt động là khi bạn không chắc sẽ lưu bao nhiêu giá trị trong mảng. Nếu là trường hợp này, bạn muốn khai báo mảng trước, rồi cấp phát bộ nhớ khi chương trình biết sẽ lưu bao nhiêu giá trị.
Trong trường hợp này, mảng chứa giá trị chuỗi. Tuy nhiên, bạn cũng có thể khai báo mảng số nguyên, mảng đối tượng, mảng mảng, hoặc mảng chứa kiểu dữ liệu khác.
Khởi tạo mảng (Initializing an Array)
Chúng ta chưa xong việc thiết lập mảng. Cho đến nay, chúng ta khai báo mảng tiêu chuẩn. Vấn đề là nó chưa giữ giá trị nào. Cú pháp gán tập giá trị khởi tạo cho mảng khi khai báo biến là:
String[] coffees = { "Rwanda Izuba", "French Roast", "Vietnam Da La Arabica" }; Trong ví dụ này, chúng ta gán ba giá trị cho mảng.
Truy cập phần tử trong mảng (Accessing the Elements in an Array)
Điều tuyệt vời của mảng là dễ truy cập. Ẩn dụ, giống như khoanh tròn mục trong danh sách việc bạn muốn tập trung.
Bên trong mảng, mỗi mục được cho số đặc biệt riêng. Chúng gọi là số chỉ mục (index numbers). Số chỉ mục bắt đầu từ 0, và tăng 1 cho mỗi mục trong mảng. Xem danh sách sau:
- 0: Rwanda Izuba
- 1: French Roast
- 2: Vietnam Da Lat Arabica
Trong danh sách này, pha chế Rwanda Izuba có chỉ mục 0, French Roast có chỉ mục 1, Vietnam Da Lat Arabica có chỉ mục 2. Hãy lấy mảng sau:
String[] coffees = { "Rwanda Izuba", "French Roast", "Vietnam Da La Arabica" }; Nếu muốn truy cập mục đầu tiên trong mảng, bạn có thể dùng mã:
System.out.println(coffees[0]);
Mã trả về: Rwanda Izuba.
Giá trị chỉ mục truyền vào mảng giữa ngoặc vuông. Phạm vi số tồn tại như giá trị chỉ mục là giữa 0 và nhỏ hơn một độ dài mảng. Điều này là vì, như nhắc trước, mảng được lập chỉ mục từ giá trị 0.
Nếu cố truy cập giá trị chỉ mục không tồn tại, lỗi trả về:
ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
Trong trường hợp này, chúng ta cố truy cập chỉ mục 3 trong mảng. Vì chỉ mục chỉ lên đến hai – nhớ, mảng lập chỉ mục từ 0 – lỗi trả về.
Hãy nâng cấp. Giả sử bạn muốn duyệt qua mọi mục trong mảng và thực hiện thao tác trên từng cái riêng lẻ. Chúng ta sẽ in mọi mục trong mảng ra console. Bạn có thể làm được dùng vòng lặp for-each, như sau:
class CoffeeArray { public static void main(String[] args) { String[] coffees = { "Rwanda Izuba", "French Roast", "Vietnam Da La Arabica" }; for (String coffee : coffees) { System.out.println(coffee); } } } Mã trả về:
Rwanda Izuba French Roast Vietnam Da La Arabica
Trong ví dụ này, mã lặp qua mọi mục trong mảng coffees và in từng mục ra console. Chúng ta dùng vòng lặp for-each thay vì vòng lặp "for" vì nó không cần bộ đếm, nghĩa là súc tích và dễ đọc hơn.
Thay đổi mục trong mảng (Changing Items in an Array)
Houston, chúng ta có vấn đề. Hóa ra pha chế Pháp yêu thích không thực sự gọi là French Roast. Nó gọi là French Classic. Nếu muốn thay đổi, ta dùng lập chỉ mục (indexing).
Xem mã sau:
class CoffeeArray { public static void main(String[] args) { String[] coffees = { "Rwanda Izuba", "French Roast", "Vietnam Da La Arabica" }; coffees[1] = "French Classic"; System.out.println(coffees[1]); } } Chúng ta dùng toán tử gán (=) thay đổi giá trị cà phê tồn tại tại vị trí chỉ mục 1. Chúng ta thay giá trị từ French Roast thành French Classic. Mã trả về: French Classic.
Ví dụ Mảng Java (Java Array: An Example)
Hãy gộp tất cả khái niệm đã thảo luận vào một ví dụ. Giả sử chúng ta muốn tính tổng chi tiêu cà phê tuần qua.
Đầu tiên, thiết lập lớp và biến cho chương trình:
class CoffeePrices { public static void main(String[] args) { Double[] purchases = {2.55, 2.75, 2.99, 3.05}; double sum = 0; } } Chúng ta khai báo hai biến. Một lưu danh sách mua hàng. Biến sau lưu bộ đếm chi tiêu cà phê. Bước tiếp theo là tạo vòng lặp for-each duyệt qua mọi lần mua cà phê và cộng vào biến "sum":
for (double purchase : purchases) { sum += purchase; } Nếu chạy mã, chương trình tính tổng chi tiêu cà phê tuần qua. Chỉ có vấn đề: chương trình không cho biết giá trị đó! Chúng ta lấy giá trị bằng in ra console:
Khi chạy toàn bộ mã, kết quả trả về:
You've spent $11.34 on coffee in the last week. $11.34 on coffee. Not bad! What a useful program.
Kết luận (và Thử thách)
Mảng là kiểu dữ liệu lưu nhiều giá trị cùng kiểu dữ liệu. Bạn có thể khai báo mảng cho bất cứ thứ gì, như danh sách sách yêu thích, danh sách người chơi game, hoặc danh sách số muốn tính trung bình.
Bạn đang tìm thử thách? Đọc tiếp.
Viết chương trình yêu cầu người dùng chọn điểm đến du lịch để tìm hiểu thêm. Bạn nên lưu điểm đến trong mảng. Bạn nên lưu mô tả một câu cho mỗi điểm đến trong mảng riêng.
Khi người dùng chọn điểm đến, tìm nó trong mảng điểm đến, và tính số chỉ mục. Sau đó, dùng số chỉ mục đó in mô tả một câu của điểm đến tương ứng ra console.
Bây giờ bạn đã sẵn sàng dùng mảng trong Java như chuyên nghiệp!