集合差集
本课属于 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}这个操作特别适合用来查找缺少的内容、尚未完成的事项,或一个集合相对于另一个集合的独有内容。交集会找出共同点,而差集则会突出一个集合与另一个集合的不同之处。
挑战
简单创建一个项目管理程序,找出已计划但尚未完成的任务。你的程序应当:
- 读取一个表示项目名称的字符串输入
- 读取多个表示已计划任务的字符串输入(收到
"planned_done"时,输入结束) - 读取多个表示已完成任务的字符串输入(收到
"completed_done"时,输入结束) - 创建两个独立的集合,分别存储已计划的任务和已完成的任务
- 使用
difference()方法找出已计划但尚未完成的任务 - 按照下方所示的确切格式输出项目状态分析结果
例如,项目名称为 "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");
// 在这里添加剩余的输出语句
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程控制中的所有课
自己练习: Dart 在线编译器