Menu
CoddyTech

Tổng quan về List, Set và Map

Thuộc phần Lập trình hướng đối tượng trong hành trình Dart của Coddy. Bài học 63 trên 110.

Dart cung cấp ba kiểu tập hợp cốt lõi mà bạn sẽ thường xuyên dùng khi xây dựng ứng dụng. Mỗi kiểu phục vụ một mục đích khác nhau trong việc sắp xếp và truy cập dữ liệu.

Danh sách là một tập hợp có thứ tự, trong đó bạn truy cập các phần tử bằng chỉ số. Các phần tử giữ nguyên thứ tự thêm vào và có thể trùng lặp:

var fruits = ['apple', 'banana', 'apple'];
print(fruits[0]);      // apple
print(fruits.length);  // 3

Tập hợp (set) là một tập hợp không có thứ tự gồm các phần tử duy nhất. Nếu bạn thử thêm phần tử trùng lặp, phần tử đó sẽ bị bỏ qua:

var uniqueNumbers = {1, 2, 3, 2, 1};
print(uniqueNumbers);  // {1, 2, 3}

Map lưu trữ các cặp khóa-giá trị, giúp bạn tra cứu giá trị bằng khóa tương ứng:

var ages = {'Alice': 30, 'Bob': 25};
print(ages['Alice']);  // 30

Đây là phần so sánh nhanh:

Bộ sưu tậpCó thứ tựPhần tử trùng lặpTruy cập theo
Danh sáchCóĐược phépChỉ số
Tập hợpKhôngKhông được phépKiểm tra phần tử có tồn tại
Ánh xạKhông*Khóa duy nhấtKhóa

Các tập hợp này càng mạnh mẽ hơn khi kết hợp với kiểu tổng quát (generics). Bạn sẽ tìm hiểu về chúng trong các bài học sắp tới để tạo ra những tập hợp an toàn về kiểu dữ liệu, có thể hoạt động với các lớp tùy chỉnh của bạn.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống quản lý lớp học sử dụng cả ba kiểu tập hợp để sắp xếp dữ liệu học sinh theo những cách khác nhau. Bạn sẽ thấy List, Set và Map có mục đích riêng như thế nào khi quản lý cùng một thông tin.

Bạn sẽ sắp xếp code thành hai tệp:

  • classroom.dart: Tạo một lớp Classroom quản lý dữ liệu học sinh bằng cả ba kiểu tập hợp:
    • Một List<String> tên là attendanceOrder để theo dõi thứ tự học sinh đến lớp (cho phép trùng lặp nếu một học sinh điểm danh nhiều lần)
    • Một Set<String> tên là uniqueStudents để theo dõi những học sinh có mặt (không trùng lặp)
    • Một Map<String, int> tên là scores để lưu điểm kiểm tra của từng học sinh
    Lớp Classroom cần có các phương thức sau:
    • recordArrival(String name) - thêm tên vào cả danh sách điểm danh và tập hợp học sinh duy nhất
    • setScore(String name, int score) - lưu điểm của học sinh vào từ điển
    • printReport() - in ra báo cáo lớp học (định dạng được hiển thị bên dưới)
  • main.dart: Nhập tệp lớp học và minh họa hệ thống:
    • Tạo một đối tượng Classroom
    • Ghi nhận học sinh đến theo thứ tự này: 'Alice', 'Bob', 'Alice', 'Carol', 'Bob'
    • Đặt điểm: Alice = 95, Bob = 87, Carol = 92
    • Gọi printReport()

Phương thức printReport() sẽ in ra:

Arrival Order: [Alice, Bob, Alice, Carol, Bob]
Unique Students: {Alice, Bob, Carol}
Scores: {Alice: 95, Bob: 87, Carol: 92}

Hãy chú ý cách List giữ lại mọi lượt đến lớp (kể cả mục trùng lặp), Set tự động chỉ giữ lại các tên duy nhất, còn Map liên kết từng học sinh với điểm số của họ. Mỗi kiểu tập hợp đều phát huy đúng mục đích của mình!

Đầu ra dự kiến:

Arrival Order: [Alice, Bob, Alice, Carol, Bob]
Unique Students: {Alice, Bob, Carol}
Scores: {Alice: 95, Bob: 87, Carol: 92}

Tự làm thử

import 'classroom.dart';

void main() {
  // TODO: Tạo một instance của Classroom
  
  // TODO: Ghi nhận thứ tự đến: 'Alice', 'Bob', 'Alice', 'Carol', 'Bob'
  
  // TODO: Đặt điểm số: Alice = 95, Bob = 87, Carol = 92
  
  // TODO: Gọi printReport() để hiển thị dữ liệu lớp học
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Dart online