Menu
Coddy logo textTech

Rimozione dalla lista: removeWhere

Fa parte della sezione Logica e flusso del percorso Dart di Coddy. Lezione 5 di 65.

A volte devi rimuovere più elementi da un elenco in base a una condizione specifica. Invece di rimuovere gli elementi uno alla volta, Dart mette a disposizione il metodo removeWhere(), che può rimuovere tutti gli elementi che soddisfano una condizione di test con una sola operazione.

Il metodo removeWhere() accetta una funzione di test come parametro. Questa funzione riceve ogni elemento della lista e restituisce true se l'elemento deve essere rimosso, oppure false se deve rimanere. Il metodo rimuove quindi tutti gli elementi per i quali la funzione di test restituisce true.

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

// Rimuovi tutti i numeri pari
numbers.removeWhere((number) => number % 2 == 0);

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

Questo approccio è molto più efficiente che cercare e rimuovere manualmente gli elementi uno per uno. Il metodo removeWhere() modifica direttamente la lista originale, rendendolo uno strumento potente per ripulire le liste in base a qualsiasi condizione tu possa esprimere come test booleano.

challenge icon

Sfida

Facile

Crea un programma che gestisca un sistema di filtraggio dei voti degli studenti rimuovendo dall'elenco della classe gli studenti non promossi. Il tuo programma deve:

  1. Leggere una stringa che rappresenta il nome della classe
  2. Leggere più valori interi che rappresentano i voti degli studenti (l'input terminerà quando ricevi -1)
  3. Usare il metodo removeWhere() per rimuovere tutti i voti inferiori a 60 (voti insufficienti)
  4. Stampare i risultati del filtraggio dei voti nel formato esatto mostrato qui sotto

Per esempio, se il nome della classe è "Mathematics 101" e i voti sono 85, 45, 92, 38, 76, 55, 88, il tuo programma dovrebbe produrre:

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

Se il nome della classe è "History 201" e tutti i voti sono sufficienti: 75, 82, 91, il tuo programma dovrebbe produrre:

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

Se il nome della classe è "Chemistry 301" e tutti i voti sono insufficienti: 45, 32, 58, il tuo programma dovrebbe produrre:

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

Il tuo programma deve usare il metodo removeWhere() con una funzione di test che restituisca true per i voti inferiori a 60. Il metodo dovrebbe modificare la lista originale rimuovendo tutti i voti insufficienti, lasciando solo quelli sufficienti.

Provalo tu

import 'dart:io';

void main() {
  // Leggi il nome della classe
  String? className = stdin.readLineSync();
  
  // Leggi i punteggi finché non viene incontrato -1
  List<int> scores = [];
  while (true) {
    int score = int.parse(stdin.readLineSync()!);
    if (score == -1) {
      break;
    }
    scores.add(score);
  }
  
  // Memorizza i punteggi originali per visualizzarli
  List<int> originalScores = List.from(scores);
  
  // TODO: Scrivi il tuo codice qui sotto
  // Usa il metodo removeWhere() per rimuovere i punteggi inferiori a 60
  
  // Stampa i risultati
  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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Dart online