Menu
CoddyTech

将列表转换为集合

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

Set 最实用的用途之一是从 List 中删除重复元素。由于集合会自动消除重复项,你可以轻松地将包含重复值的列表转换为只包含唯一元素的集合。

要将 List 转换为 Set,只需将列表传入 Set.from() 构造函数。这样会创建一个新集合,其中包含原列表中的所有唯一元素。

List<int> numbersWithDuplicates = [1, 2, 2, 3, 3, 3, 4, 5, 5];
Set<int> uniqueNumbers = Set.from(numbersWithDuplicates);

print(uniqueNumbers);  // {1, 2, 3, 4, 5}

如果你需要将结果转回 List(例如,为了与代码的其他部分保持兼容),可以使用 toList() 将集合转回列表。这样得到的列表只包含原始集合中的唯一元素。

List<int> uniqueList = Set.from(numbersWithDuplicates).toList();
print(uniqueList);  // [1, 2, 3, 4, 5]

在需要通过删除重复项来清理数据,同时保留列表结构以便后续处理时,列表 → 集合 → 列表这种模式非常常见。

challenge icon

挑战

简单

创建一个程序,通过删除调查回复中的重复条目来管理数据清理系统。你的程序应该:

  1. 读取一个表示调查标题的字符串输入
  2. 读取多个表示调查回复的字符串输入(收到 "responses_done" 时结束输入)
  3. 创建一个列表来存储所有原始回复(包括重复项)
  4. 使用 Set.from() 将列表转换为 Set,并自动删除重复项
  5. 使用 toList() 将 Set 转回包含唯一回复的列表
  6. 按照下方显示的准确格式输出数据清理结果

例如,如果调查标题是 "Customer Satisfaction Survey",回复是 "Excellent"、"Good"、"Excellent"、"Fair"、"Good"、"Excellent"、"Poor",你的程序应该输出:

Survey: Customer Satisfaction Survey
Original responses: [Excellent, Good, Excellent, Fair, Good, Excellent, Poor]
Total responses collected: 7
Converting to Set to remove duplicates...
Unique responses (Set): {Excellent, Good, Fair, Poor}
Converting back to List...
Cleaned responses: [Excellent, Good, Fair, Poor]
Duplicates removed: 3
Final unique responses: 4
Status: Data cleaning completed successfully

如果调查标题是 "Product Feedback",回复是 "Like"、"Dislike"、"Like"、"Like",你的程序应该输出:

Survey: Product Feedback
Original responses: [Like, Dislike, Like, Like]
Total responses collected: 4
Converting to Set to remove duplicates...
Unique responses (Set): {Like, Dislike}
Converting back to List...
Cleaned responses: [Like, Dislike]
Duplicates removed: 2
Final unique responses: 2
Status: Data cleaning completed successfully

如果调查标题是 "Event Rating",回复是 "Amazing"、"Okay"、"Great",你的程序应该输出:

Survey: Event Rating
Original responses: [Amazing, Okay, Great]
Total responses collected: 3
Converting to Set to remove duplicates...
Unique responses (Set): {Amazing, Okay, Great}
Converting back to List...
Cleaned responses: [Amazing, Okay, Great]
Duplicates removed: 0
Final unique responses: 3
Status: Data cleaning completed successfully

你的程序必须演示完整的 List → Set → List 转换过程。首先将所有回复存储在 List 中,然后使用 Set.from() 从 List 创建 Set,最后使用 toList() 将 Set 转回 List。用原始回复总数减去最终唯一回复数,计算删除的重复项数量。

亲手试试

import 'dart:io';

void main() {
  // 读取调查标题
  String? surveyTitle = stdin.readLineSync();
  
  // 读取调查回答,直到遇到 "responses_done"
  List<String> originalResponses = [];
  String? response;
  while ((response = stdin.readLineSync()) != "responses_done") {
    if (response != null) {
      originalResponses.add(response);
    }
  }
  
  // TODO: 在下面编写你的代码
  // 1. 使用 Set.from() 将列表转换为 Set(去除重复项)
  // 2. 使用 toList() 将 Set 转换回 List
  // 3. 计算去除的重复项数量和最终数量
  
  // 按要求的格式输出结果
  print("Survey: $surveyTitle");
  print("Original responses: $originalResponses");
  // 在这里添加剩余的 print 语句
}
quiz icon自我测试

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

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

自己练习: Dart 在线编译器