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.
Desafío
FácilCrea 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:
- Leer una entrada de cadena que represente el nombre de la clase
- Leer múltiples entradas de números enteros que representen las puntuaciones de los estudiantes (la entrada terminará cuando recibas
-1) - Usar el método
removeWhere()para eliminar todas las puntuaciones que estén por debajo de 60 (calificaciones reprobatorias) - 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: 3Si 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: 0Si 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: 3Tu 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}');
}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