Menu
Coddy logo textTech

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);  // 8

Para 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.

challenge icon

Desafío

Fácil

Crea 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:

  1. Leer una entrada de cadena que represente el nombre del departamento (department name)
  2. Leer múltiples entradas de números enteros que representen los niveles de prioridad de las quejas (la entrada terminará cuando recibas -1)
  3. Leer una entrada de número entero que represente el umbral de prioridad urgente (urgent priority threshold)
  4. Usar el método firstWhere() para encontrar la primera queja con un nivel de prioridad mayor o igual al umbral urgente
  5. 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 required

Si 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 processing

Si 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 required

Tu 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);  // 8

Utiliza 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
}
quiz iconPonte a prueba

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