Menu
CoddyTech

回顾:不重复的访客名单

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

challenge icon

挑战

简单

创建一个程序,通过分析来自两个不同邀请来源的宾客名单来管理活动筹备系统。你的程序应:

  1. 读取一个表示活动名称的字符串输入
  2. 读取多个表示第一份邀请名单中宾客的字符串输入(收到 "list1_done" 时,输入结束)
  3. 读取多个表示第二份邀请名单中宾客的字符串输入(收到 "list2_done" 时,输入结束)
  4. 将两份宾客名单都转换为集合,自动处理每份名单中的重复项
  5. 使用 union() 方法查找受邀参加活动的所有不重复宾客
  6. 使用 intersection() 方法查找同时出现在两份邀请名单中的宾客
  7. 使用 difference() 方法查找只出现在第一份邀请名单中的宾客
  8. 严格按照下方所示的格式打印宾客名单分析结果

例如,活动名称为 "Birthday Party",第一份名单包含 "Alice"、"Bob"、"Charlie"、"Diana",第二份名单包含 "Bob"、"Diana"、"Eve"、"Frank",你的程序应输出:

Event: Birthday Party
First invitation list: {Alice, Bob, Charlie, Diana}
Second invitation list: {Bob, Diana, Eve, Frank}
All unique guests: {Alice, Bob, Charlie, Diana, Eve, Frank}
Guests on both lists: {Bob, Diana}
Guests only on first list: {Alice, Charlie}
Total unique guests: 6
Duplicate invitations: 2
First list only: 2
Status: Guest list analysis completed

如果活动名称为 "Wedding Reception",第一份名单包含 "John"、"Mary"、"Sarah",第二份名单包含 "Tom"、"Lisa"、"Mike",你的程序应输出:

Event: Wedding Reception
First invitation list: {John, Mary, Sarah}
Second invitation list: {Tom, Lisa, Mike}
All unique guests: {John, Mary, Sarah, Tom, Lisa, Mike}
Guests on both lists: {}
Guests only on first list: {John, Mary, Sarah}
Total unique guests: 6
Duplicate invitations: 0
First list only: 3
Status: Guest list analysis completed

如果活动名称为 "Company Meeting",第一份名单包含 "Alex"、"Jordan"、"Taylor"、"Morgan"、"Alex",第二份名单包含 "Jordan"、"Taylor"、"Casey"、"Jordan",你的程序应输出:

Event: Company Meeting
First invitation list: {Alex, Jordan, Taylor, Morgan}
Second invitation list: {Jordan, Taylor, Casey}
All unique guests: {Alex, Jordan, Taylor, Morgan, Casey}
Guests on both lists: {Jordan, Taylor}
Guests only on first list: {Alex, Morgan}
Total unique guests: 5
Duplicate invitations: 2
First list only: 2
Status: Guest list analysis completed

你的程序必须演示全部三种集合运算:使用 union() 合并所有宾客,使用 intersection() 查找同时出现在两份名单中的宾客,使用 difference() 查找仅在第一份名单中的宾客。先将输入名单转换为集合,以处理各份名单中的重复项,然后再执行集合运算,分析宾客分布。

亲手试试

import 'dart:io';

void main() {
  // 读取活动名称
  String? eventName = stdin.readLineSync();
  
  // 读取第一个邀请列表
  List<String> firstList = [];
  String? input;
  while ((input = stdin.readLineSync()) != "list1_done") {
    if (input != null) {
      firstList.add(input);
    }
  }
  
  // 读取第二个邀请列表
  List<String> secondList = [];
  while ((input = stdin.readLineSync()) != "list2_done") {
    if (input != null) {
      secondList.add(input);
    }
  }
  
  // 将列表转换为集合
  Set<String> firstSet = firstList.toSet();
  Set<String> secondSet = secondList.toSet();
  
  // TODO:在下方编写你的代码
  // 使用 union()、intersection() 和 difference() 方法分析宾客列表
  // 计算所有不重复的宾客、同时出现在两个列表中的宾客,以及只在第一个列表中的宾客
  
  // 按要求的格式输出结果
  print("Event: $eventName");
  print("First invitation list: $firstSet");
  print("Second invitation list: $secondSet");
  // 在这里添加剩余的输出语句
}

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

自己练习: Dart 在线编译器