📦 Mảng Đơn - Single Dimensional Arrays
Chào mừng đến với bài học về Single Dimensional Arrays - cách quản lý danh sách trong Café!
🎯 Món Ăn Hôm Nay
Tưởng tượng bạn đang quản lý quán cà phê:
- Menu 5 món → Mảng tên đồ uống
- Bảng giá → Mảng số nguyên
- Quản lý nhiều giá trị cùng lúc → Hiệu quả hơn
Đó chính là Arrays - nhóm nhiều giá trị cùng kiểu!
📦 Array Là Gì?
Array = Khay đựng đồ (nhóm nhiều biến cùng kiểu)
// Thay vì:
String mon1 = "Latte";
String mon2 = "Cappuccino";
String mon3 = "Espresso";
// Dùng array:
String[] menu = {"Latte", "Cappuccino", "Espresso"};
☕ Ẩn Dụ Café:
- Array = Khay đựng ly cà phê
- Elements = Các ly trong khay
- Index = Vị trí ly (0, 1, 2, ...)
- Length = Số ly trong khay
🔢 Index - Chỉ Số Mảng
Index bắt đầu từ 0!
String[] menu = {"Latte", "Mocha", "Espresso"};
// [0] [1] [2]
System.out.println(menu[0]); // "Latte"
System.out.println(menu[1]); // "Mocha"
System.out.println(menu[2]); // "Espresso"
👨🍳 Câu Chuyện Trong Quán
Tình huống 1: Quản Lý Menu
public class QuanLyMenu {
public static void main(String[] args) {
// Khai báo mảng menu
String[] menu = {"Espresso", "Latte", "Cappuccino", "Mocha", "Americano"};
System.out.println("☕ MENU CÀ PHÊ:\n");
// In từng món
for (int i = 0; i < menu.length; i++) {
System.out.println((i + 1) + ". " + menu[i]);
}
System.out.println("\nTổng số món: " + menu.length);
}
}
Output:
☕ MENU CÀ PHÊ:
1. Espresso
2. Latte
3. Cappuccino
4. Mocha
5. Americano
Tổng số món: 5
Tình huống 2: Bảng Giá
public class BangGia {
public static void main(String[] args) {
String[] tenMon = {"Espresso", "Latte", "Cappuccino"};
int[] giaMon = {45000, 50000, 55000};
System.out.println("💰 BẢNG GIÁ:\n");
for (int i = 0; i < tenMon.length; i++) {
System.out.printf("%-15s: %,d VND%n", tenMon[i], giaMon[i]);
}
}
}
Output:
💰 BẢNG GIÁ:
Espresso : 45,000 VND
Latte : 50,000 VND
Cappuccino : 55,000 VND
📝 Công Thức Nấu (Code Examples)
Ví Dụ 1: Khai Báo Mảng
public class KhaiBaoMang {
public static void main(String[] args) {
// Cách 1: Khai báo và khởi tạo
String[] mon = {"Latte", "Mocha", "Espresso"};
// Cách 2: Khai báo rồi gán
int[] gia = new int[3];
gia[0] = 50000;
gia[1] = 60000;
gia[2] = 45000;
// Cách 3: Khai báo với kích thước
boolean[] conHang = new boolean[5]; // Mặc định: false
// In mảng
System.out.println("🍵 Món: " + mon[0] + ", Giá: " + gia[0]);
}
}
Ví Dụ 2: Duyệt Mảng Với For Loop
public class DuyetMang {
public static void main(String[] args) {
int[] soLuong = {10, 5, 8, 12, 3};
String[] tenMon = {"Espresso", "Latte", "Mocha", "Cappuccino", "Americano"};
System.out.println("📦 KIỂM TRA KHO:\n");
for (int i = 0; i < soLuong.length; i++) {
System.out.printf("%-12s: %2d ly", tenMon[i], soLuong[i]);
if (soLuong[i] < 5) {
System.out.print(" ⚠️ Sắp hết!");
}
System.out.println();
}
}
}
Output:
📦 KIỂM TRA KHO:
Espresso : 10 ly
Latte : 5 ly
Mocha : 8 ly
Cappuccino : 12 ly
Americano : 3 ly ⚠️ Sắp hết!
Ví Dụ 3: Enhanced For Loop (For-Each)
public class ForEach {
public static void main(String[] args) {
String[] menu = {"Espresso", "Latte", "Cappuccino", "Mocha"};
System.out.println("☕ MENU:\n");
// For-each: duyệt từng phần tử
for (String mon : menu) {
System.out.println("- " + mon);
}
}
}
Output:
☕ MENU:
- Espresso
- Latte
- Cappuccino
- Mocha
Ví Dụ 4: Tìm Giá Trị Lớn Nhất/Nhỏ Nhất
public class TimMinMax {
public static void main(String[] args) {
int[] gia = {45000, 60000, 50000, 55000, 48000};
String[] mon = {"Espresso", "Mocha", "Latte", "Cappuccino", "Americano"};
// Tìm giá cao nhất
int maxGia = gia[0];
int maxIndex = 0;
for (int i = 1; i < gia.length; i++) {
if (gia[i] > maxGia) {
maxGia = gia[i];
maxIndex = i;
}
}
// Tìm giá thấp nhất
int minGia = gia[0];
int minIndex = 0;
for (int i = 1; i < gia.length; i++) {
if (gia[i] < minGia) {
minGia = gia[i];
minIndex = i;
}
}
System.out.println("🏆 MÓN ĐẮT NHẤT:");
System.out.println(" " + mon[maxIndex] + ": " + maxGia + " VND");
System.out.println("\n💰 MÓN RẺ NHẤT:");
System.out.println(" " + mon[minIndex] + ": " + minGia + " VND");
}
}
Output:
🏆 MÓN ĐẮT NHẤT:
Mocha: 60000 VND
💰 MÓN RẺ NHẤT:
Espresso: 45000 VND
Ví Dụ 5: Tính Tổng Và Trung Bình
public class TinhTongTrungBinh {
public static void main(String[] args) {
int[] doanhThu = {150000, 200000, 180000, 220000, 170000, 190000, 210000};
String[] ngay = {"T2", "T3", "T4", "T5", "T6", "T7", "CN"};
System.out.println("📊 DOANH THU TUẦN:\n");
int tong = 0;
for (int i = 0; i < doanhThu.length; i++) {
System.out.printf("%s: %,d VND%n", ngay[i], doanhThu[i]);
tong += doanhThu[i];
}
double trungBinh = (double) tong / doanhThu.length;
System.out.println("\n━━━━━━━━━━━━━━━━━━━━━");
System.out.printf("Tổng: %,d VND%n", tong);
System.out.printf("TB/ngày: %,.0f VND%n", trungBinh);
}
}
Output:
📊 DOANH THU TUẦN:
T2: 150,000 VND
T3: 200,000 VND
T4: 180,000 VND
T5: 220,000 VND
T6: 170,000 VND
T7: 190,000 VND
CN: 210,000 VND
━━━━━━━━━━━━━━━━━━━━━
Tổng: 1,320,000 VND
TB/ngày: 188,571 VND
Ví Dụ 6: Sao Chép Mảng
public class SaoChepMang {
public static void main(String[] args) {
int[] giaGoc = {50000, 60000, 55000};
// ❌ SAI: Gán tham chiếu
int[] gia1 = giaGoc;
gia1[0] = 99999; // Thay đổi cả giaGoc!
// ✅ ĐÚNG: Sao chép
int[] gia2 = new int[giaGoc.length];
for (int i = 0; i < giaGoc.length; i++) {
gia2[i] = giaGoc[i];
}
// Hoặc dùng Arrays.copyOf()
int[] gia3 = java.util.Arrays.copyOf(giaGoc, giaGoc.length);
System.out.println("Giá gốc [0]: " + giaGoc[0]); // 99999
System.out.println("Giá 2 [0]: " + gia2[0]); // 99999
System.out.println("Giá 3 [0]: " + gia3[0]); // 99999
}
}
🔥 Thực Hành Trong Quán
Bài Tập 1: Quản Lý Số Lượng Bán
public class SoLuongBan {
public static void main(String[] args) {
String[] mon = {"Espresso", "Latte", "Mocha", "Cappuccino"};
int[] soBan = {25, 40, 15, 30};
System.out.println("📈 SỐ LƯỢNG BÁN HÔM NAY:\n");
int tongSoBan = 0;
String monBanChay = mon[0];
int maxBan = soBan[0];
for (int i = 0; i < mon.length; i++) {
System.out.printf("%-12s: %2d ly%n", mon[i], soBan[i]);
tongSoBan += soBan[i];
// Tìm món bán chạy
if (soBan[i] > maxBan) {
maxBan = soBan[i];
monBanChay = mon[i];
}
}
System.out.println("\n━━━━━━━━━━━━━━━━━━━━");
System.out.println("Tổng số ly: " + tongSoBan);
System.out.println("Bán chạy nhất: " + monBanChay + " (" + maxBan + " ly)");
}
}
Bài Tập 2: Tăng Giá 10%
public class TangGia {
public static void main(String[] args) {
String[] mon = {"Espresso", "Latte", "Cappuccino"};
int[] giaCu = {45000, 50000, 55000};
int[] giaMoi = new int[giaCu.length];
System.out.println("💰 ĐIỀU CHỈNH GIÁ (+10%):\n");
for (int i = 0; i < giaCu.length; i++) {
giaMoi[i] = (int) (giaCu[i] * 1.1);
System.out.printf("%-12s: %,d → %,d VND%n",
mon[i], giaCu[i], giaMoi[i]);
}
}
}
Output:
💰 ĐIỀU CHỈNH GIÁ (+10%):
Espresso : 45,000 → 49,500 VND
Latte : 50,000 → 55,000 VND
Cappuccino : 55,000 → 60,500 VND
Bài Tập 3: Đảo Ngược Mảng
public class DaoNguocMang {
public static void main(String[] args) {
String[] thuTu = {"Sáng", "Trưa", "Chiều", "Tối"};
System.out.println("📅 THỨ TỰ GỐC:");
for (String buoi : thuTu) {
System.out.print(buoi + " ");
}
// Đảo ngược
for (int i = 0; i < thuTu.length / 2; i++) {
String temp = thuTu[i];
thuTu[i] = thuTu[thuTu.length - 1 - i];
thuTu[thuTu.length - 1 - i] = temp;
}
System.out.println("\n\n📅 SAU KHI ĐẢO:");
for (String buoi : thuTu) {
System.out.print(buoi + " ");
}
}
}
Output:
📅 THỨ TỰ GỐC:
Sáng Trưa Chiều Tối
📅 SAU KHI ĐẢO:
Tối Chiều Trưa Sáng
Bài Tập 4: Tìm Phần Tử
public class TimPhanTu {
public static void main(String[] args) {
String[] menu = {"Espresso", "Latte", "Mocha", "Cappuccino", "Americano"};
String timKiem = "Mocha";
System.out.println("🔍 TÌM KIẾM: " + timKiem + "\n");
boolean timThay = false;
int viTri = -1;
for (int i = 0; i < menu.length; i++) {
if (menu[i].equals(timKiem)) {
timThay = true;
viTri = i;
break;
}
}
if (timThay) {
System.out.println("✅ Tìm thấy tại vị trí: " + viTri);
System.out.println(" (Index: " + viTri + ")");
} else {
System.out.println("❌ Không tìm thấy!");
}
}
}
⚠️ Lỗi Thường Gặp
Lỗi 1: ArrayIndexOutOfBoundsException
// ❌ SAI: Index vượt quá giới hạn
String[] menu = {"Latte", "Mocha", "Espresso"}; // Length = 3
System.out.println(menu[3]); // ❌ Lỗi! Index 0-2
// ✅ ĐÚNG: Kiểm tra length
if (3 < menu.length) {
System.out.println(menu[3]);
} else {
System.out.println("Index không hợp lệ!");
}
Lỗi 2: NullPointerException
// ❌ SAI: Mảng null
String[] menu = null;
System.out.println(menu.length); // ❌ NullPointerException
// ✅ ĐÚNG: Kiểm tra null
if (menu != null) {
System.out.println(menu.length);
}
Lỗi 3: Gán Tham Chiếu Thay Vì Sao Chép
// ❌ SAI: Gán tham chiếu
int[] gia1 = {50000, 60000};
int[] gia2 = gia1; // Cùng trỏ 1 mảng!
gia2[0] = 99999; // Thay đổi cả gia1
// ✅ ĐÚNG: Sao chép
int[] gia2 = java.util.Arrays.copyOf(gia1, gia1.length);
Lỗi 4: Quên Index Bắt Đầu Từ 0
// ❌ SAI: Nghĩ index bắt đầu từ 1
String[] menu = {"Latte", "Mocha"};
String monDauTien = menu[1]; // ❌ Lấy "Mocha" thay vì "Latte"
// ✅ ĐÚNG: Index 0 là phần tử đầu tiên
String monDauTien = menu[0]; // "Latte"
💡 Bí Quyết Của Barista
- Index bắt đầu từ 0: Phần tử đầu tiên là
arr[0] - Length - 1: Index cuối cùng là
arr.length - 1 - Kiểm tra null: Luôn check
arr != null - Kiểm tra bounds: Đảm bảo index < length
- For-each cho đọc: Dùng for-each khi chỉ cần đọc
- For loop cho sửa: Dùng for loop khi cần index
🎓 Bạn Đã Học Được
- ✅ Array = Nhóm nhiều biến cùng kiểu
- ✅ Khai báo:
type[] name = {values} - ✅ Index bắt đầu từ 0
- ✅ Length:
arr.length - ✅ Duyệt với for loop và for-each
- ✅ Tìm min/max, tính tổng/trung bình
- ✅ Sao chép mảng đúng cách
☕ Món Tiếp Theo
Đã biết mảng đơn! Giờ học về mảng đa chiều:
👉 Mảng Đa Chiều - Multi-Dimensional Arrays
💡 Lời Khuyên Cuối: Array như khay đựng ly trong quán - sắp xếp gọn gàng sẽ dễ quản lý và sử dụng!