Поиск с помощью '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. Этот параметр принимает функцию, которая возвращает значение по умолчанию, если совпадение не найдено, предотвращая аварийное завершение вашей программы с ошибкой.
Задание
ЛегкоСоздайте программу для управления системой обслуживания клиентов, которая находит первую жалобу клиента, требующую немедленного внимания. Ваша программа должна:
- Считать строковый ввод, представляющий название отдела
- Считать несколько целых чисел, представляющих уровни приоритета жалоб (ввод закончится, когда вы получите
-1) - Считать целое число, представляющее порог срочного приоритета
- Использовать метод
firstWhere(), чтобы найти первую жалобу с уровнем приоритета, который больше или равен порогу срочности - Вывести результаты обслуживания клиентов в точном формате, показанном ниже
Например, если название отдела — "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');
// Вывод результата первой срочной жалобы
// Вывод сообщения о статусе
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая работа со списками
Свойства списка: first и lastСостояние списка: isEmpty и isNotEmptyРазворот спискаДобавление в список: insertУдаление из списка: removeWhereПоиск в списке: indexOfСортировка спискаПеремешивание спискаИтоги — Органайзер списков4Продвинутая работа с Map
Итерация по MapПроверка ключей и значенийСвойства Map: keys и valuesУсловное добавление: putIfAbsentУдаление записей из MapВложенные MapИтоги — Обновление инвентаря2Функциональные операции со списками
Преобразование с помощью 'map'Фильтрация с помощью 'where'Использование '.toList()'Проверка условий с помощью 'any'Условия с 'every'Поиск с помощью 'firstWhere'Повторение — фильтрация данных5Проект: Калькулятор корзины
Настройка проектаДобавление товаров в корзину3Множества
Что такое множество?Создание множестваДобавление и удаление элементовПроверка наличия элементов в множествеПреобразование списка в множествоОбъединение множествПересечение множествРазность множествИтоги: уникальный список гостей