Menu
CoddyTech

Фильтрация с помощью 'where'

Часть раздела Логика и управление потоком путешествия по Dart на Coddy. Урок 11 из 65.

В то время как map() преобразует каждый элемент в списке, иногда вам нужно оставить только те элементы, которые соответствуют определенным критериям. Метод where() позволяет фильтровать список, проверяя каждый элемент на соответствие условию и сохраняя только те, которые прошли проверку.

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

List<int> scores = [45, 78, 92, 33, 67, 88];

// Оставляем только баллы выше 50
var passingScores = scores.where((score) => score > 50);
print(passingScores);  // (78, 92, 67, 88)

Этот подход к фильтрации гораздо чище, чем ручной перебор списка в цикле и создание новой коллекции. Метод where() представляет собой фундаментальный паттерн обработки данных, позволяющий декларативно указать, что вы хотите сохранить, а не то, как это извлечь.

challenge icon

Задание

Легко

Создайте программу для управления системой отслеживания успеваемости студентов путем фильтрации студентов на основе их результатов тестов. Ваша программа должна:

  1. Прочитать строковый ввод, представляющий название класса
  2. Прочитать несколько целочисленных вводов, представляющих результаты тестов студентов (ввод закончится, когда вы получите -1)
  3. Прочитать целочисленный ввод, представляющий минимальный порог проходного балла
  4. Использовать метод where() для фильтрации и сохранения только тех баллов, которые больше или равны порогу
  5. Вывести результаты фильтрации в точном формате, показанном ниже

Например, если название класса — "Mathematics 101", баллы — 85, 42, 78, 91, 55, 88, а порог — 70, ваша программа должна вывести:

Class: Mathematics 101
Original scores: [85, 42, 78, 91, 55, 88]
Minimum passing score: 70
Filtering scores >= 70
Passing scores: (85, 78, 91, 88)
Students passed: 4 out of 6
Pass rate: 66.67%

Если название класса — "Science Lab", баллы — 45, 38, 52, а порог — 60, ваша программа должна вывести:

Class: Science Lab
Original scores: [45, 38, 52]
Minimum passing score: 60
Filtering scores >= 60
Passing scores: ()
Students passed: 0 out of 3
Pass rate: 0.00%

Если название класса — "History", баллы — 95, 88, 92, а порог — 80, ваша программа должна вывести:

Class: History
Original scores: [95, 88, 92]
Minimum passing score: 80
Filtering scores >= 80
Passing scores: (95, 88, 92)
Students passed: 3 out of 3
Pass rate: 100.00%

Ваша программа должна использовать метод where() для фильтрации баллов, которые больше или равны порогу. Отфильтрованный результат будет отображаться в формате круглых скобок как итерируемый объект. Рассчитайте процент успеваемости с точностью до 2 знаков после запятой по формуле: (passing students / total students) * 100.

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

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);
  }
  
  // Чтение минимального порога проходного балла
  int threshold = int.parse(stdin.readLineSync()!);
  
  // TODO: Напишите свой код ниже
  // Используйте метод where() для фильтрации оценок >= threshold
  
  // Вывод результатов в требуемом формате
  print('Class: $className');
  print('Original scores: $scores');
  print('Minimum passing score: $threshold');
  print('Filtering scores >= $threshold');
  // Вывод проходных баллов, количества сдавших студентов и процента успеваемости
}
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Dart