Menu
CoddyTech

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.

challenge icon

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:

  1. Đọc một đầu vào chuỗi (string) đại diện cho tên dự án
  2. Đọ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")
  3. Đọ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")
  4. 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
  5. 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
  6. 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) remaining

Nế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 successfully

Nế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) remaining

Chươ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
}
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 Logic và luồng điều khiển

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