Menu
Coddy logo textTech

Поиск с помощью 'firstWhere'

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

Когда вам нужно найти в списке конкретный элемент, соответствующий определенным критериям, метод firstWhere() предлагает эффективное решение. В отличие от методов фильтрации, которые возвращают все подходящие элементы, firstWhere() прекращает поиск, как только находит первый элемент, удовлетворяющий вашему условию.

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

List<int> numbers = [1, 3, 8, 15, 22, 7];

// Найти первое четное число
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven);  // 8

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

challenge icon

Задание

Легко

Создайте программу для управления системой обслуживания клиентов, которая находит первую жалобу клиента, требующую немедленного внимания. Ваша программа должна:

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

Например, если название отдела — "Technical Support", уровни приоритета — 3, 7, 2, 9, 4, а порог срочности — 8, ваша программа должна вывести:

Department: Technical Support
All complaints: [3, 7, 2, 9, 4]
Urgent threshold: 8
Searching for first complaint >= 8
First urgent complaint: 9
Status: Urgent complaint found - immediate action required

Если название отдела — "Billing Department", уровни приоритета — 4, 6, 3, 5, а порог срочности — 7, ваша программа должна вывести:

Department: Billing Department
All complaints: [4, 6, 3, 5]
Urgent threshold: 7
Searching for first complaint >= 7
First urgent complaint: Not found
Status: No urgent complaints - continue normal processing

Если название отдела — "Sales Support", уровни приоритета — 10, 2, 8, а порог срочности — 9, ваша программа должна вывести:

Department: Sales Support
All complaints: [10, 2, 8]
Urgent threshold: 9
Searching for first complaint >= 9
First urgent complaint: 10
Status: Urgent complaint found - immediate action required

Ваша программа должна использовать метод firstWhere(), чтобы найти первый приоритет жалобы, который больше или равен порогу срочности. Если срочная жалоба не найдена, выведите "Not found" для первой срочной жалобы и "No urgent complaints - continue normal processing" в качестве статуса. Если срочная жалоба найдена, выведите уровень приоритета и "Urgent complaint found - immediate action required" в качестве статуса.

Шпаргалка

Метод firstWhere() находит первый элемент в списке, который соответствует определенному условию. Он прекращает поиск, как только находит совпадение, и возвращает этот элемент.

List<int> numbers = [1, 3, 8, 15, 22, 7];

// Найти первое четное число
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven);  // 8

Используйте параметр orElse, чтобы предоставить значение по умолчанию, если ни один элемент не соответствует условию:

// Возвращает значение по умолчанию, если совпадение не найдено
int result = numbers.firstWhere(
  (number) => number > 100,
  orElse: () => -1
);

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

import 'dart:io';

void main() {
  // Чтение названия отдела
  String? department = stdin.readLineSync();
  
  // Чтение уровней приоритета жалоб до тех пор, пока не встретится -1
  List<int> complaints = [];
  while (true) {
    int priority = int.parse(stdin.readLineSync()!);
    if (priority == -1) break;
    complaints.add(priority);
  }
  
  // Чтение порога срочности
  int urgentThreshold = int.parse(stdin.readLineSync()!);
  
  // TODO: Напишите свой код ниже
  // Используйте метод firstWhere(), чтобы найти первую жалобу >= urgentThreshold
  
  // Вывод результатов
  print('Department: $department');
  print('All complaints: $complaints');
  print('Urgent threshold: $urgentThreshold');
  print('Searching for first complaint >= $urgentThreshold');
  // Вывод результата первой срочной жалобы
  // Вывод сообщения о статусе
}
quiz iconПроверьте себя

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

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