Menu
CoddyTech

Xóa khỏi danh sách: removeWhere

Thuộc phần Logic và luồng điều khiển trong hành trình Dart của Coddy. Bài học 5 trên 65.

Đôi khi, bạn cần xóa nhiều phần tử khỏi danh sách dựa trên một điều kiện cụ thể. Thay vì xóa từng phần tử một, Dart cung cấp phương thức removeWhere(), giúp xóa tất cả phần tử thỏa mãn điều kiện kiểm tra trong một thao tác.

Phương thức removeWhere() nhận một hàm kiểm tra làm tham số. Hàm này nhận từng phần tử trong danh sách và trả về true nếu cần xóa phần tử đó, hoặc false nếu cần giữ lại. Sau đó, phương thức xóa tất cả phần tử mà hàm kiểm tra trả về true.

List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8];

// Xóa tất cả số chẵn
numbers.removeWhere((number) => number % 2 == 0);

print(numbers);  // [1, 3, 5, 7]

Cách này hiệu quả hơn nhiều so với việc tìm và xóa từng phần tử theo cách thủ công. Phương thức removeWhere() sửa đổi trực tiếp danh sách ban đầu, nên đây là một công cụ hữu ích để dọn dẹp danh sách dựa trên bất kỳ điều kiện nào bạn có thể biểu diễn bằng một phép kiểm tra Boolean.

challenge icon

Thử thách

Dễ

Tạo chương trình quản lý hệ thống lọc điểm học sinh bằng cách xóa những học sinh không đạt khỏi danh sách lớp. Chương trình của bạn cần:

  1. Đọc một chuỗi đầu vào biểu thị tên lớp
  2. Đọc nhiều số nguyên biểu thị điểm của học sinh (đầu vào kết thúc khi bạn nhận được -1)
  3. Dùng phương thức removeWhere() để xóa tất cả điểm dưới 60 (điểm không đạt)
  4. In kết quả lọc điểm theo đúng định dạng bên dưới

Ví dụ, nếu tên lớp là "Mathematics 101" và các điểm lần lượt là 85, 45, 92, 38, 76, 55, 88, chương trình của bạn sẽ in ra:

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

Nếu tên lớp là "History 201" và tất cả điểm đều đạt: 75, 82, 91, chương trình của bạn sẽ in ra:

Class: History 201
Original scores: [75, 82, 91]
Removed failing scores (below 60)
Passing scores: [75, 82, 91]
Students passed: 3
Students failed: 0

Nếu tên lớp là "Chemistry 301" và tất cả điểm đều không đạt: 45, 32, 58, chương trình của bạn sẽ in ra:

Class: Chemistry 301
Original scores: [45, 32, 58]
Removed failing scores (below 60)
Passing scores: []
Students passed: 0
Students failed: 3

Chương trình của bạn phải dùng phương thức removeWhere() với một hàm kiểm tra trả về true cho các điểm dưới 60. Phương thức này cần sửa đổi danh sách ban đầu bằng cách xóa tất cả điểm không đạt, chỉ giữ lại các điểm đạt.

Tự làm thử

import 'dart:io';

void main() {
  // Đọc tên lớp
  String? className = stdin.readLineSync();
  
  // Đọc các điểm số cho đến khi gặp -1
  List<int> scores = [];
  while (true) {
    int score = int.parse(stdin.readLineSync()!);
    if (score == -1) {
      break;
    }
    scores.add(score);
  }
  
  // Lưu điểm số ban đầu để hiển thị
  List<int> originalScores = List.from(scores);
  
  // TODO: Viết code bên dưới
  // Dùng phương thức (method) removeWhere() để xóa các điểm số dưới 60
  
  // In ra kết quả
  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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch Dart online