移除列表元素:removeWhere
本课属于 Coddy Dart 学习旅程的“逻辑与流程控制”单元。第 5 课,共 65 课。
有时,你需要根据特定条件从列表中删除多个元素。Dart 提供了 removeWhere() 方法,可以一次性删除所有符合测试条件的元素,而不必逐个删除。
removeWhere() 方法会将一个测试函数作为参数。这个函数会接收列表中的每个元素,如果该元素应该被移除,就返回 true;如果应该保留,就返回 false。然后,该方法会移除测试函数返回 true 的所有元素。
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8];
// 移除所有偶数
numbers.removeWhere((number) => number % 2 == 0);
print(numbers); // [1, 3, 5, 7]这种方法比手动逐个查找并删除元素高效得多。removeWhere() 方法会直接修改原列表,是一个强大的工具,可以根据你能用布尔测试表达的任何条件清理列表。
挑战
简单编写一个程序,通过从班级名单中移除不及格的学生来管理学生成绩筛选系统。你的程序应:
- 读取一个表示班级名称的字符串输入
- 读取多个表示学生成绩的整数输入(收到
-1时,输入结束) - 使用
removeWhere()方法移除所有低于 60 的成绩(不及格成绩) - 按照下方所示的准确格式打印成绩筛选结果
例如,如果班级名称是 "Mathematics 101",成绩依次为 85、45、92、38、76、55、88,你的程序应输出:
Class: Mathematics 101
Original scores: [85, 45, 92, 38, 76, 55, 88]
Removed failing scores (below 60)
Passing scores: [85, 92, 76, 88]
Students passed: 4
Students failed: 3如果班级名称是 "History 201",且所有成绩都及格:75、82、91,你的程序应输出:
Class: History 201
Original scores: [75, 82, 91]
Removed failing scores (below 60)
Passing scores: [75, 82, 91]
Students passed: 3
Students failed: 0如果班级名称是 "Chemistry 301",且所有成绩都不及格:45、32、58,你的程序应输出:
Class: Chemistry 301
Original scores: [45, 32, 58]
Removed failing scores (below 60)
Passing scores: []
Students passed: 0
Students failed: 3你的程序必须使用 removeWhere() 方法,并提供一个测试函数,使成绩低于 60 时返回 true。该方法应修改原列表,移除所有不及格成绩,只保留及格成绩。
亲手试试
import 'dart:io';
void main() {
// 读取班级名称
String? className = stdin.readLineSync();
// 读取分数,直到遇到 -1
List<int> scores = [];
while (true) {
int score = int.parse(stdin.readLineSync()!);
if (score == -1) {
break;
}
scores.add(score);
}
// 保存原始分数,以便显示
List<int> originalScores = List.from(scores);
// TODO: 在下方编写你的代码
// 使用 removeWhere() 方法删除低于 60 分的分数
// 输出结果
print('Class: $className');
print('Original scores: $originalScores');
print('Removed failing scores (below 60)');
print('Passing scores: $scores');
print('Students passed: ${scores.length}');
print('Students failed: ${originalScores.length - scores.length}');
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程控制中的所有课
自己练习: Dart 在线编译器