Phép hiệu của các tập hợp
Thuộc phần Logic và luồng điều khiển trong hành trình Dart của Coddy. Bài học 24 trên 65.
Đôi khi bạn cần tìm các phần tử có trong một Set nhưng không có trong Set khác. Phương thức difference() giúp bạn làm việc này bằng cách tạo một tập hợp mới chỉ chứa các phần tử có trong tập hợp thứ nhất nhưng không có trong tập hợp thứ hai.
Hãy nghĩ về phép này như phép trừ trên các tập hợp: bạn loại bỏ mọi phần tử của tập hợp thứ hai khỏi tập hợp thứ nhất. Phương thức difference() trả về một tập hợp mới gồm các phần tử còn lại, đồng thời giữ nguyên cả hai tập hợp ban đầu.
Set<String> todaysTasks = {'email', 'meeting', 'report', 'calls'};
Set<String> completedTasks = {'email', 'calls'};
Set<String> remainingTasks = todaysTasks.difference(completedTasks);
print(remainingTasks); // {meeting, report}Phép toán này đặc biệt hữu ích khi bạn muốn tìm những gì còn thiếu, những việc còn cần làm hoặc những gì chỉ có trong tập hợp này mà không có trong tập hợp kia. Khác với phép giao (intersection), phép toán tìm các phần tử chung, phép hiệu làm nổi bật điểm khác biệt giữa hai tập hợp.
Thử thách
DễTạo một chương trình quản lý hệ thống quản lý dự án bằng cách xác định các nhiệm vụ đã lên kế hoạch nhưng chưa hoàn thành. Chương trình của bạn cần:
- Đọc một đầu vào chuỗi (string) đại diện cho tên dự án
- Đọc nhiều đầu vào chuỗi đại diện cho các nhiệm vụ đã lên kế hoạch (đầu vào sẽ kết thúc khi bạn nhận được
"planned_done") - Đọc nhiều đầu vào chuỗi đại diện cho các nhiệm vụ đã hoàn thành (đầu vào sẽ kết thúc khi bạn nhận được
"completed_done") - Tạo hai tập hợp (set) riêng để lưu các nhiệm vụ đã lên kế hoạch và các nhiệm vụ đã hoàn thành
- Dùng phương thức
difference()để tìm các nhiệm vụ đã lên kế hoạch nhưng chưa hoàn thành - In phần phân tích trạng thái dự án theo đúng định dạng bên dưới
Ví dụ: nếu tên dự án là "Website Launch", các nhiệm vụ đã lên kế hoạch là "Design mockups", "Write content", "Setup database", "Test functionality", "Deploy site", và các nhiệm vụ đã hoàn thành là "Design mockups", "Setup database", chương trình của bạn sẽ in ra:
Project: Website Launch
Planned tasks: {Design mockups, Write content, Setup database, Test functionality, Deploy site}
Completed tasks: {Design mockups, Setup database}
Remaining tasks: {Write content, Test functionality, Deploy site}
Tasks completed: 2
Tasks remaining: 3
Progress: 40.0% complete
Status: Project in progress - 3 task(s) remainingNếu tên dự án là "Mobile App Development", các nhiệm vụ đã lên kế hoạch là "Create wireframes", "Develop UI", "Implement features", và các nhiệm vụ đã hoàn thành là "Create wireframes", "Develop UI", "Implement features", chương trình của bạn sẽ in ra:
Project: Mobile App Development
Planned tasks: {Create wireframes, Develop UI, Implement features}
Completed tasks: {Create wireframes, Develop UI, Implement features}
Remaining tasks: {}
Tasks completed: 3
Tasks remaining: 0
Progress: 100.0% complete
Status: Project completed successfullyNếu tên dự án là "Marketing Campaign", các nhiệm vụ đã lên kế hoạch là "Research target audience", "Create content", "Design graphics", "Launch campaign", "Analyze results", và các nhiệm vụ đã hoàn thành là "Research target audience", chương trình của bạn sẽ in ra:
Project: Marketing Campaign
Planned tasks: {Research target audience, Create content, Design graphics, Launch campaign, Analyze results}
Completed tasks: {Research target audience}
Remaining tasks: {Create content, Design graphics, Launch campaign, Analyze results}
Tasks completed: 1
Tasks remaining: 4
Progress: 20.0% complete
Status: Project in progress - 4 task(s) remainingChương trình của bạn phải dùng phương thức difference() để tìm các nhiệm vụ có trong tập hợp nhiệm vụ đã lên kế hoạch nhưng không có trong tập hợp nhiệm vụ đã hoàn thành. Tính phần trăm tiến độ bằng cách lấy số nhiệm vụ đã hoàn thành chia cho tổng số nhiệm vụ đã lên kế hoạch rồi nhân với 100, làm tròn đến 1 chữ số thập phân. Nếu tất cả nhiệm vụ đã hoàn thành, hãy hiển thị "Project completed successfully" làm trạng thái; nếu không, hãy hiển thị "Project in progress - X task(s) remaining", trong đó X là số nhiệm vụ còn lại.
Tự làm thử
import 'dart:io';
void main() {
// Đọc tên dự án
String? projectName = stdin.readLineSync();
// Đọc các công việc dự kiến cho đến khi gặp "planned_done"
Set<String> plannedTasks = <String>{};
String? task;
while ((task = stdin.readLineSync()) != "planned_done") {
if (task != null) {
plannedTasks.add(task);
}
}
// Đọc các công việc đã hoàn thành cho đến khi gặp "completed_done"
Set<String> completedTasks = <String>{};
while ((task = stdin.readLineSync()) != "completed_done") {
if (task != null) {
completedTasks.add(task);
}
}
// TODO: Viết code của bạn bên dưới
// Dùng phương thức difference() để tìm các công việc còn lại
// Tính tỷ lệ phần trăm tiến độ
// Xác định trạng thái dự án
// In ra kết quả
print("Project: $projectName");
print("Planned tasks: $plannedTasks");
print("Completed tasks: $completedTasks");
// Thêm các câu lệnh in ra còn lại tại đây
}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 Logic và luồng điều khiển
1Thao tác nâng cao với danh sách
Thuộc tính danh sách: đầu và cuốiTrạng thái danh sách: isEmpty và isNotEmpĐảo ngược danh sáchThêm vào danh sách: insertXóa khỏi danh sách: removeWhereTìm trong danh sách: indexOfSắp xếp danh sáchXáo trộn danh sáchÔn tập: trình sắp xếp danh sách4Thao tác nâng cao với Map
Duyệt qua MapKiểm tra khóa và giá trịCác thuộc tính của Map: khóa và giá trịThêm có điều kiện: putIfAbsentXóa mục khỏi MapMap lồng nhauÔn tập: Cập nhật kho hàng2Thao tác hàm trên danh sách
Biến đổi bằng 'map'Lọc bằng 'where'Dùng '.toList()'Kiểm tra điều kiện bằng 'any'Điều kiện với 'every'Tìm phần tử bằng 'firstWhere'Ôn tập: lọc dữ liệu5Dự án: Tính tiền giỏ hàng
Thiết lập dự ánThêm mặt hàng vào giỏ8Dự án: Trình phân tích văn bản đơn giản
Tổng quan và thiết lập dự ánĐếm ký tự3Tập hợp
Tập hợp là gì?Tạo tập hợpThêm và xóa phần tử khỏi tập hợpKiểm tra phần tử trong tập hợpChuyển danh sách thành tập hợpPhép hợp của các tập hợpPhép giao của các tập hợpPhép hiệu của các tập hợpÔn tập: danh sách khách mời không trùng lặpTự luyện tập: Trình biên dịch Dart online