Menu
CoddyTech

列表、集合与映射概览

本课属于 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

下面是一个快速对比:

集合类型有序重复项访问方式
列表是允许索引
集合否不允许检查是否包含
映射否*键唯一键

在接下来的课程中,你将探索如何结合泛型来增强这些集合的功能,并创建能与你的自定义类配合使用的类型安全集合。

challenge icon

挑战

简单

让我们构建一个课堂管理系统,使用三种集合类型以不同方式整理学生数据。你会看到,在管理相同信息时,列表、集合和映射各有不同用途。

你要将代码整理到两个文件中:

  • classroom.dart:创建一个 Classroom 类,使用三种集合类型管理学生数据:
    • 使用名为 attendanceOrder 的 List<String>,按学生到达的顺序记录学生(如果学生多次签到,可以有重复项)
    • 使用名为 uniqueStudents 的 Set<String>,记录哪些学生已到场(不允许重复项)
    • 使用名为 scores 的 Map<String, int>,存储每位学生的测试成绩
    你的 Classroom 应包含以下方法:
    • 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() 显示教室数据
}
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: Dart 在线编译器