Búsqueda con 'firstWhere'
Parte de la sección Lógica y Flujo del Journey de Dart de Coddy — lección 15 de 65.
Cuando necesites encontrar un elemento específico en una lista que cumpla con ciertos criterios, el método firstWhere() proporciona una solución eficiente. A diferencia de los métodos de filtrado que devuelven todos los elementos coincidentes, firstWhere() deja de buscar tan pronto como encuentra el primer elemento que satisface tu condición.
El método firstWhere() recibe una función de prueba que devuelve true o false para cada elemento. Examina los elementos uno por uno hasta que encuentra el primero que pasa la prueba, y luego devuelve inmediatamente ese elemento.
List<int> numbers = [1, 3, 8, 15, 22, 7];
// Encontrar el primer número par
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven); // 8Para situaciones en las que ningún elemento coincide con tu condición, firstWhere() proporciona un parámetro orElse opcional. Este parámetro acepta una función que devuelve un valor predeterminado cuando no se encuentra ninguna coincidencia, lo que evita que tu programa falle con un error.
Desafío
FácilCrea un programa que gestione un sistema de atención al cliente encontrando la primera queja de un cliente que requiere atención inmediata. Tu programa debe:
- Leer una entrada de cadena que represente el nombre del departamento (department name)
- Leer múltiples entradas de números enteros que representen los niveles de prioridad de las quejas (la entrada terminará cuando recibas
-1) - Leer una entrada de número entero que represente el umbral de prioridad urgente (urgent priority threshold)
- Usar el método
firstWhere()para encontrar la primera queja con un nivel de prioridad mayor o igual al umbral urgente - Imprimir los resultados del servicio al cliente en el formato exacto que se muestra a continuación
Por ejemplo, si el nombre del departamento es "Technical Support", los niveles de prioridad son 3, 7, 2, 9, 4, y el umbral urgente es 8, tu programa debería mostrar:
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 requiredSi el nombre del departamento es "Billing Department", los niveles de prioridad son 4, 6, 3, 5, y el umbral urgente es 7, tu programa debería mostrar:
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 processingSi el nombre del departamento es "Sales Support", los niveles de prioridad son 10, 2, 8, y el umbral urgente es 9, tu programa debería mostrar:
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 requiredTu programa debe usar el método firstWhere() para encontrar la primera prioridad de queja que sea mayor o igual al umbral urgente. Si no se encuentra ninguna queja urgente, muestra "Not found" para la primera queja urgente y muestra "No urgent complaints - continue normal processing" como el estado. Si se encuentra una queja urgente, muestra el nivel de prioridad y muestra "Urgent complaint found - immediate action required" como el estado.
Hoja de referencia
El método firstWhere() encuentra el primer elemento en una lista que cumple con una condición específica. Deja de buscar tan pronto como encuentra una coincidencia y devuelve ese elemento.
List<int> numbers = [1, 3, 8, 15, 22, 7];
// Encuentra el primer número par
int firstEven = numbers.firstWhere((number) => number % 2 == 0);
print(firstEven); // 8Utiliza el parámetro orElse para proporcionar un valor predeterminado cuando ningún elemento coincide con la condición:
// Devuelve un valor predeterminado si no se encuentra ninguna coincidencia
int result = numbers.firstWhere(
(number) => number > 100,
orElse: () => -1
);Pruébalo tú mismo
import 'dart:io';
void main() {
// Leer el nombre del departamento
String? department = stdin.readLineSync();
// Leer los niveles de prioridad de las quejas hasta -1
List<int> complaints = [];
while (true) {
int priority = int.parse(stdin.readLineSync()!);
if (priority == -1) break;
complaints.add(priority);
}
// Leer el umbral de urgencia
int urgentThreshold = int.parse(stdin.readLineSync()!);
// TODO: Escribe tu código a continuación
// Usa el método firstWhere() para encontrar la primera queja >= urgentThreshold
// Mostrar los resultados
print('Department: $department');
print('All complaints: $complaints');
print('Urgent threshold: $urgentThreshold');
print('Searching for first complaint >= $urgentThreshold');
// Imprimir el resultado de la primera queja urgente
// Imprimir mensaje de estado
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Manipulación avanzada de listas
Propiedades de listas: first y lastEstado de la lista: isEmpty y isNotEmptyInvertir una listaAñadir a una lista: insertEliminación en listas: removeWhereBúsqueda en una lista: indexOfOrdenar una listaMezclar una listaResumen - Organizador de listas4Manipulación avanzada de mapas
Iterar sobre un mapaComprobación de claves y valoresPropiedades del mapa: keys y valuesAdición condicional: putIfAbsentEliminar entradas de un mapaMapas anidadosResumen - Actualización de inventario2Operaciones funcionales con listas
Transformar con 'map'Filtrar con 'where'Uso de '.toList()'Comprobar condiciones con 'any'Condiciones con 'every'Búsqueda con 'firstWhere'Resumen - Filtrado de datos5Proyecto: Calculadora de carrito de compras
Configuración del proyectoAgregar artículos al carrito3Conjuntos
¿Qué es un Conjunto?Crear un ConjuntoAñadir y eliminar elementos de un ConjuntoComprobar elementos en un ConjuntoConvertir una lista en un ConjuntoUnión de ConjuntosIntersección de ConjuntosDiferencia de ConjuntosResumen - Lista de invitados única