Chuyển tới nội dung chính

📦 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

  1. Index bắt đầu từ 0: Phần tử đầu tiên là arr[0]
  2. Length - 1: Index cuối cùng là arr.length - 1
  3. Kiểm tra null: Luôn check arr != null
  4. Kiểm tra bounds: Đảm bảo index < length
  5. For-each cho đọc: Dùng for-each khi chỉ cần đọc
  6. 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!