Menu
Coddy logo textTech

Удаление из списка: removeWhere

Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 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() с функцией проверки, которая возвращает true для баллов ниже 60. Метод должен изменить исходный список, удалив все неудовлетворительные оценки и оставив только проходные баллы.

Шпаргалка

Метод removeWhere() удаляет из списка все элементы, соответствующие определенному условию. Он принимает функцию-тест, которая возвращает true для элементов, которые нужно удалить, и false для элементов, которые нужно оставить.

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

// Удалить все четные числа
numbers.removeWhere((number) => number % 2 == 0);

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

Этот метод изменяет исходный список напрямую и является более эффективным, чем удаление элементов по одному.

Попробуйте сами

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Проверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком