列表、集合与映射概览
本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 63 课,共 110 课。
Dart 提供了三种核心集合类型,你在构建应用程序时会经常用到它们。每种类型都有不同的用途,用于组织和访问数据。
列表是一种有序集合,可以通过索引访问元素。元素会保持插入顺序,并且允许重复:
var fruits = ['apple', 'banana', 'apple'];
print(fruits[0]); // apple
print(fruits.length); // 3集合是由不重复元素组成的无序集合。如果你尝试添加重复元素,它会被直接忽略:
var uniqueNumbers = {1, 2, 3, 2, 1};
print(uniqueNumbers); // {1, 2, 3}Map 存储键值对,让你可以通过对应的键查找值:
var ages = {'Alice': 30, 'Bob': 25};
print(ages['Alice']); // 30下面是一个快速对比:
| 集合类型 | 有序 | 重复项 | 访问方式 |
|---|---|---|---|
| 列表 | 是 | 允许 | 索引 |
| 集合 | 否 | 不允许 | 检查是否包含 |
| 映射 | 否* | 键唯一 | 键 |
在接下来的课程中,你将探索如何结合泛型来增强这些集合的功能,并创建能与你的自定义类配合使用的类型安全集合。
挑战
简单让我们构建一个课堂管理系统,使用三种集合类型以不同方式整理学生数据。你会看到,在管理相同信息时,列表、集合和映射各有不同用途。
你要将代码整理到两个文件中:
classroom.dart:创建一个Classroom类,使用三种集合类型管理学生数据:- 使用名为
attendanceOrder的List<String>,按学生到达的顺序记录学生(如果学生多次签到,可以有重复项) - 使用名为
uniqueStudents的Set<String>,记录哪些学生已到场(不允许重复项) - 使用名为
scores的Map<String, int>,存储每位学生的测试成绩
recordArrival(String name):将姓名添加到考勤列表和唯一学生集合中setScore(String name, int score):将学生的成绩存储在映射中printReport():打印课堂报告(格式如下所示)
- 使用名为
main.dart:导入课堂文件并演示该系统:- 创建一个
Classroom实例 - 按以下顺序记录到场情况:
'Alice'、'Bob'、'Alice'、'Carol'、'Bob' - 设置成绩:Alice =
95,Bob =87,Carol =92 - 调用
printReport()
- 创建一个
printReport() 方法应输出:
Arrival Order: [Alice, Bob, Alice, Carol, Bob]
Unique Students: {Alice, Bob, Carol}
Scores: {Alice: 95, Bob: 87, Carol: 92}注意,列表会保留每次到场记录(包括重复项),集合会自动只保留不重复的姓名,而映射会将每位学生与其成绩关联起来。每种集合类型都恰好发挥了自己的作用!
预期输出:
Arrival Order: [Alice, Bob, Alice, Carol, Bob]
Unique Students: {Alice, Bob, Carol}
Scores: {Alice: 95, Bob: 87, Carol: 92}亲手试试
import 'classroom.dart';
void main() {
// TODO: 创建一个 Classroom 实例
// TODO: 按以下顺序记录到达情况:'Alice'、'Bob'、'Alice'、'Carol'、'Bob'
// TODO: 设置分数:Alice = 95,Bob = 87,Carol = 92
// TODO: 调用 printReport() 显示教室数据
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Dart 在线编译器