I. Cơ Bản Về Tập Hợp
1. Khái Quát
2. Các Phương Thức Khởi Tạo và Thêm Phần Tử Của ArrayList
Ví dụ:
3. Các Phương Thức Của ArrayList
II. Nâng Cao Tập Hợp
III. Giao Diện Collection
1. Khái Quát
Ví dụ:
2. Các Phương Thức Thông Dụng Của Collection
Ví dụ:
3. Lặp Trong Collection
4. Giao Diện List
(1) Đặc Điểm và Khái Quát
Ví dụ:
(2) Các Phương Thức Riêng Của List
(3) Ngoại Lệ Sửa Đổi Đồng Thời
Ví dụ:
(4) Iterator Của List
Ví dụ:
(5) Vòng Lặp Tăng Cường
Ví dụ:
Ví dụ lặp với các phương pháp khác nhau:
(6) Đặc Điểm Của Các Lớp Con List
Ví dụ mã:
(7) Các Tính Năng Riêng Của LinkedList
Ví dụ:
5. Giao Diện Set
(1) Khái Quát
Ví dụ:
(2) Giá Trị Băm
Ví dụ:
(3) HashSet và Đặc Điểm
Ví dụ:
(4) Phân Tích Nguồn Mã Đảm Bảo Tính Duy Nhất Của HashSet
Khi thêm phần tử vào HashSet, hệ thống sẽ:
- Tính toán mã băm của đối tượng để xác định vị trí chèn
- So sánh mã băm với các phần tử hiện có
- Nếu có mã băm trùng, gọi phương thức equals() để kiểm tra tính bằng nhau
- Chỉ chèn khi không phát hiện phần tử trùng
Ví dụ với kiểu dữ liệu nguyên thủy:
...
Kết quả chạy:
Ví dụ với đối tượng tự định nghĩa:
...
Kết quả chạy:
Để HashSet hoạt động với đối tượng tự định nghĩa, cần ghi đè hashCode() và equals(). HashSet sử dụng HashMap bên trong, kiểm tra sự tồn tại bằng mã băm và phương thức equals()
(5) LinkedHashMap và Đặc Điểm
Ví dụ:
(6) TreeSet và Đặc Điểm
Ví dụ:
Sắp Xếp Tự Nhiên
① TreeSet sử dụng compareTo() để sắp xếp theo thứ tự tăng dần
② Lớp chứa phần tử phải implements Comparable
③ Phải triển khai phương thức compareTo()
Ví dụ:
Sắp Xếp Tùy Chỉnh
① Sử dụng Comparator khi không implements Comparable
② Phương thức compare() xác định thứ tự
③ Truyền Comparator vào constructor TreeSet
④ Giới hạn chỉ thêm các đối tượng cùng loại
⑤ Hai phần tử bằng nhau khi compare() trả về 0
Ví dụ:
IV. Giao Diện Map
1. Khái Quát
Ví dụ:
2. Các Chức Năng Của Map
3. Các Phương Pháp Truy Xuất Dữ Liệu
Ví dụ:
4. Các Cách Duyệt Map
(1) Cách 1
Ví dụ:
(2) Cách 2
Ví dụ:
5. Ví Dụ Minh Họa
Ví Dụ 1: HashMap Lưu Trữ Đối Tượng Sinh Viên
Ví Dụ 2: ArrayList Chứa HashMap
Ví Dụ 3: HashMap Chứa ArrayList
Ví Dụ 4: Đếm Tần Suất Ký Tự
V. Lớp Collections
1. Khái Quát
Ví dụ:
2. Ví Dụ
VI. Ví Dụ Thực Tế
1. Phân Tích Yêu Cầu Game Đấu Địa Chủ
package com.example.landlord;
import java.util.ArrayList;
import java.util.Collections;
public class Game {
public static void main(String[] args) {
// Khởi tạo bộ bài
ArrayList<String> deck = new ArrayList<>();
// Các chất bài
String[] suits = {"♦", "♥", "♠", "♣"};
// Các giá trị bài
String[] ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
// Tạo bộ bài
for (String suit : suits) {
for (String rank : ranks) {
deck.add(suit + rank);
}
}
deck.add("Joker Đen");
deck.add("Joker Đỏ");
// Xáo trộn
Collections.shuffle(deck);
// Chia bài
ArrayList<String> playerOne = new ArrayList<>();
ArrayList<String> playerTwo = new ArrayList<>();
ArrayList<String> playerThree = new ArrayList<>();
ArrayList<String> jokers = new ArrayList<>();
for (int i = 0; i < deck.size(); i++) {
String card = deck.get(i);
if (i >= deck.size() - 3) {
jokers.add(card);
} else if (i % 3 == 0) {
playerOne.add(card);
} else if (i % 3 == 1) {
playerTwo.add(card);
} else {
playerThree.add(card);
}
}
// Hiển thị bài
showCards("Người chơi 1", playerOne);
showCards("Người chơi 2", playerTwo);
showCards("Người chơi 3", playerThree);
showCards("Jokers", jokers);
}
private static void showCards(String name, ArrayList<String> hand) {
System.out.print(name + " có các lá: ");
for (String card : hand) {
System.out.print(card + " ");
}
System.out.println();
}
}
2. Phiên Bản Nâng Cao
package com.example.advanced;
import java.util.*;
public class AdvancedGame {
public static void main(String[] args) {
// Ánh xạ từ chỉ số sang bài
HashMap cardMap = new HashMap<>();
// Danh sách chỉ số
ArrayList<Integer> indices = new ArrayList<>();
// Các chất và giá trị
String[] suits = {"♦", "♥", "♠", "♣"};
String[] ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
int id = 0;
for (String rank : ranks) {
for (String suit : suits) {
cardMap.put(id, suit + rank);
indices.add(id++);
}
}
cardMap.put(id++, "Joker Đen");
cardMap.put(id++, "Joker Đỏ");
// Xáo trộn chỉ số
Collections.shuffle(indices);
// Chia bài cho người chơi
TreeSet<Integer> playerOne = new TreeSet<>();
TreeSet<Integer> playerTwo = new TreeSet<>();
TreeSet<Integer> playerThree = new TreeSet<>();
TreeSet<Integer> jokers = new TreeSet<>();
for (int i = 0; i < indices.size(); i++) {
int cardId = indices.get(i);
if (i >= indices.size() - 3) {
jokers.add(cardId);
} else if (i % 3 == 0) {
playerOne.add(cardId);
} else if (i % 3 == 1) {
playerTwo.add(cardId);
} else {
playerThree.add(cardId);
}
}
// Hiển thị bài
displayHand("Người chơi 1", cardMap, playerOne);
displayHand("Người chơi 2", cardMap, playerTwo);
displayHand("Người chơi 3", cardMap, playerThree);
displayHand("Jokers", cardMap, jokers);
}
private static void displayHand(String name, HashMap map, TreeSet<Integer> set) {
System.out.print(name + " có: ");
for (Integer index : set) {
System.out.print(map.get(index) + " ");
}
System.out.println();
}
}