Menu
CoddyTech

集合差集

本课属于 Coddy Dart 学习旅程的“逻辑与流程控制”单元。第 24 课,共 65 课。

有时,你需要找出存在于一个 Set 中但不存在于另一个 Set 中的元素。difference() 方法会创建一个新集合,其中只包含第一个集合中不存在于第二个集合中的元素。

可以把它看作集合的减法,也就是从第一个集合中移除第二个集合的所有元素。difference() 方法会返回一个只包含剩余元素的新集合,两个原集合都不会改变。

Set<String> todaysTasks = {'email', 'meeting', 'report', 'calls'};
Set<String> completedTasks = {'email', 'calls'};

Set<String> remainingTasks = todaysTasks.difference(completedTasks);
print(remainingTasks);  // {meeting, report}

这个操作特别适合用来查找缺少的内容、尚未完成的事项,或一个集合相对于另一个集合的独有内容。交集会找出共同点,而差集则会突出一个集合与另一个集合的不同之处。

challenge icon

挑战

简单

创建一个项目管理程序,找出已计划但尚未完成的任务。你的程序应当:

  1. 读取一个表示项目名称的字符串输入
  2. 读取多个表示已计划任务的字符串输入(收到 "planned_done" 时,输入结束)
  3. 读取多个表示已完成任务的字符串输入(收到 "completed_done" 时,输入结束)
  4. 创建两个独立的集合,分别存储已计划的任务和已完成的任务
  5. 使用 difference() 方法找出已计划但尚未完成的任务
  6. 按照下方所示的确切格式输出项目状态分析结果

例如,项目名称为 "Website Launch",已计划的任务为 "Design mockups"、"Write content"、"Setup database"、"Test functionality"、"Deploy site",已完成的任务为 "Design mockups"、"Setup database" 时,你的程序应输出:

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

如果项目名称为 "Mobile App Development",已计划的任务为 "Create wireframes"、"Develop UI"、"Implement features",已完成的任务为 "Create wireframes"、"Develop UI"、"Implement features",你的程序应输出:

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

如果项目名称为 "Marketing Campaign",已计划的任务为 "Research target audience"、"Create content"、"Design graphics"、"Launch campaign"、"Analyze results",已完成的任务为 "Research target audience",你的程序应输出:

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

你的程序必须使用 difference() 方法,找出存在于已计划任务集合中但不存在于已完成任务集合中的任务。将已完成任务数除以已计划任务总数,再乘以 100,计算进度百分比,并四舍五入到小数点后 1 位。如果所有任务都已完成,状态应显示 "Project completed successfully";否则显示 "Project in progress - X task(s) remaining",其中 X 是剩余任务数。

亲手试试

import 'dart:io';

void main() {
  // 读取项目名称
  String? projectName = stdin.readLineSync();
  
  // 读取计划任务,直到遇到 "planned_done"
  Set<String> plannedTasks = <String>{};
  String? task;
  while ((task = stdin.readLineSync()) != "planned_done") {
    if (task != null) {
      plannedTasks.add(task);
    }
  }
  
  // 读取已完成的任务,直到遇到 "completed_done"
  Set<String> completedTasks = <String>{};
  while ((task = stdin.readLineSync()) != "completed_done") {
    if (task != null) {
      completedTasks.add(task);
    }
  }
  
  // TODO: 在下方编写你的代码
  // 使用 difference() 方法找出剩余任务
  // 计算进度百分比
  // 确定项目状态
  
  // 输出结果
  print("Project: $projectName");
  print("Planned tasks: $plannedTasks");
  print("Completed tasks: $completedTasks");
  // 在这里添加剩余的输出语句
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程控制中的所有课

自己练习: Dart 在线编译器