Menu
CoddyTech

移除列表元素: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() 方法会直接修改原列表,是一个强大的工具,可以根据你能用布尔测试表达的任何条件清理列表。

challenge icon

挑战

简单

编写一个程序,通过从班级名单中移除不及格的学生来管理学生成绩筛选系统。你的程序应:

  1. 读取一个表示班级名称的字符串输入
  2. 读取多个表示学生成绩的整数输入(收到 -1 时,输入结束)
  3. 使用 removeWhere() 方法移除所有低于 60 的成绩(不及格成绩)
  4. 按照下方所示的准确格式打印成绩筛选结果

例如,如果班级名称是 "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}');
}
quiz icon自我测试

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

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

自己练习: Dart 在线编译器