将列表转换为集合
本课属于 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]在需要通过删除重复项来清理数据,同时保留列表结构以便后续处理时,列表 → 集合 → 列表这种模式非常常见。
挑战
简单创建一个程序,通过删除调查回复中的重复条目来管理数据清理系统。你的程序应该:
- 读取一个表示调查标题的字符串输入
- 读取多个表示调查回复的字符串输入(收到
"responses_done"时结束输入) - 创建一个列表来存储所有原始回复(包括重复项)
- 使用
Set.from()将列表转换为 Set,并自动删除重复项 - 使用
toList()将 Set 转回包含唯一回复的列表 - 按照下方显示的准确格式输出数据清理结果
例如,如果调查标题是 "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 语句
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程控制中的所有课
自己练习: Dart 在线编译器