Menu
Coddy logo textTech

Eliminación en listas: removeWhere

Parte de la sección Lógica y Flujo del Journey de Dart de Coddy — lección 5 de 65.

A veces necesitas eliminar múltiples elementos de una lista basándote en una condición específica. En lugar de eliminar elementos uno por uno, Dart proporciona el método removeWhere() que puede eliminar todos los elementos que coincidan con una condición de prueba en una sola operación.

El método removeWhere() toma una función de prueba como su parámetro. Esta función recibe cada elemento de la lista y devuelve true si el elemento debe ser eliminado, o false si debe permanecer. El método entonces elimina todos los elementos para los cuales la función de prueba devuelve true.

List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8];

// Eliminar todos los números pares
numbers.removeWhere((number) => number % 2 == 0);

print(numbers);  // [1, 3, 5, 7]

Este enfoque es mucho más eficiente que buscar y eliminar elementos individualmente de forma manual. El método removeWhere() modifica la lista original directamente, lo que lo convierte en una herramienta poderosa para limpiar listas basándose en cualquier condición que puedas expresar como una prueba booleana.

challenge icon

Desafío

Fácil

Crea un programa que gestione un sistema de filtrado de calificaciones de estudiantes eliminando a los estudiantes que reprobaron de una lista de clase. Tu programa debe:

  1. Leer una entrada de cadena que represente el nombre de la clase
  2. Leer múltiples entradas de números enteros que representen las puntuaciones de los estudiantes (la entrada terminará cuando recibas -1)
  3. Usar el método removeWhere() para eliminar todas las puntuaciones que estén por debajo de 60 (calificaciones reprobatorias)
  4. Imprimir los resultados del filtrado de calificaciones en el formato exacto que se muestra a continuación

Por ejemplo, si el nombre de la clase es "Mathematics 101" y las puntuaciones son 85, 45, 92, 38, 76, 55, 88, tu programa debería mostrar:

Class: Mathematics 101
Original scores: [85, 45, 92, 38, 76, 55, 88]
Removed failing scores (below 60)
Passing scores: [85, 92, 76, 88]
Students passed: 4
Students failed: 3

Si el nombre de la clase es "History 201" y todas las puntuaciones son aprobatorias: 75, 82, 91, tu programa debería mostrar:

Class: History 201
Original scores: [75, 82, 91]
Removed failing scores (below 60)
Passing scores: [75, 82, 91]
Students passed: 3
Students failed: 0

Si el nombre de la clase es "Chemistry 301" y todas las puntuaciones son reprobatorias: 45, 32, 58, tu programa debería mostrar:

Class: Chemistry 301
Original scores: [45, 32, 58]
Removed failing scores (below 60)
Passing scores: []
Students passed: 0
Students failed: 3

Tu programa debe usar el método removeWhere() con una función de prueba que devuelva true para puntuaciones inferiores a 60. El método debe modificar la lista original eliminando todas las calificaciones reprobatorias, dejando solo las puntuaciones aprobatorias.

Hoja de referencia

El método removeWhere() elimina todos los elementos de una lista que coinciden con una condición específica. Toma una función de prueba que devuelve true para los elementos que se van a eliminar y false para los elementos que se van a mantener.

List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8];

// Eliminar todos los números pares
numbers.removeWhere((number) => number % 2 == 0);

print(numbers);  // [1, 3, 5, 7]

El método modifica la lista original directamente y es más eficiente que eliminar elementos individualmente.

Pruébalo tú mismo

import 'dart:io';

void main() {
  // Leer el nombre de la clase
  String? className = stdin.readLineSync();
  
  // Leer puntuaciones hasta que se encuentre -1
  List<int> scores = [];
  while (true) {
    int score = int.parse(stdin.readLineSync()!);
    if (score == -1) {
      break;
    }
    scores.add(score);
  }
  
  // Almacenar las puntuaciones originales para mostrarlas
  List<int> originalScores = List.from(scores);
  
  // TODO: Escribe tu código a continuación
  // Usa el método removeWhere() para eliminar las puntuaciones inferiores a 60
  
  // Imprimir los resultados
  print('Class: $className');
  print('Original scores: $originalScores');
  print('Removed failing scores (below 60)');
  print('Passing scores: $scores');
  print('Students passed: ${scores.length}');
  print('Students failed: ${originalScores.length - scores.length}');
}
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