Menu
Coddy logo textTech

Usuwanie z listy: removeWhere

Część sekcji Logika i przepływ sterowania ścieżki Dart w Coddy. Lekcja 5 z 65.

Czasami trzeba usunąć z listy wiele elementów spełniających określony warunek. Zamiast usuwać elementy pojedynczo, możesz użyć metody removeWhere() dostępnej w Dart, która w jednej operacji usuwa wszystkie elementy spełniające warunek testowy.

Metoda removeWhere() przyjmuje funkcję testującą jako parametr. Ta funkcja otrzymuje każdy element listy i zwraca true, jeśli element powinien zostać usunięty, lub false, jeśli powinien pozostać. Następnie metoda usuwa wszystkie elementy, dla których funkcja testująca zwraca true.

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

// Usuń wszystkie liczby parzyste
numbers.removeWhere((number) => number % 2 == 0);

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

To podejście jest znacznie wydajniejsze niż ręczne wyszukiwanie i usuwanie elementów pojedynczo. Metoda removeWhere() modyfikuje bezpośrednio oryginalną listę, dzięki czemu jest potężnym narzędziem do czyszczenia list na podstawie dowolnego warunku, który możesz wyrazić jako test logiczny.

challenge icon

Wyzwanie

Łatwy

Utwórz program, który zarządza systemem filtrowania ocen uczniów, usuwając z listy klasy uczniów, którzy nie zaliczyli. Program powinien:

  1. Odczytać ciąg znaków reprezentujący nazwę klasy
  2. Odczytać wiele wartości całkowitych reprezentujących wyniki uczniów (wprowadzanie danych zakończy się po otrzymaniu -1)
  3. Użyć metody removeWhere(), aby usunąć wszystkie wyniki poniżej 60 (oceny niedostateczne)
  4. Wypisać wyniki filtrowania ocen w dokładnym formacie pokazanym poniżej

Na przykład, jeśli nazwa klasy to "Mathematics 101", a wyniki to 85, 45, 92, 38, 76, 55, 88, program powinien wypisać:

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

Jeśli nazwa klasy to "History 201", a wszystkie wyniki są zaliczające: 75, 82, 91, program powinien wypisać:

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

Jeśli nazwa klasy to "Chemistry 301", a wszystkie wyniki są niezaliczające: 45, 32, 58, program powinien wypisać:

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

Program musi używać metody removeWhere() z funkcją testującą, która zwraca true dla wyników poniżej 60. Metoda powinna zmodyfikować oryginalną listę, usuwając wszystkie oceny niedostateczne i pozostawiając wyłącznie oceny zaliczające.

Spróbuj swoich sił

import 'dart:io';

void main() {
  // Wczytaj nazwę klasy
  String? className = stdin.readLineSync();
  
  // Wczytuj wyniki, aż pojawi się -1
  List<int> scores = [];
  while (true) {
    int score = int.parse(stdin.readLineSync()!);
    if (score == -1) {
      break;
    }
    scores.add(score);
  }
  
  // Zachowaj oryginalne wyniki do wyświetlenia
  List<int> originalScores = List.from(scores);
  
  // TODO: Napisz swój kod poniżej
  // Użyj metody removeWhere(), aby usunąć wyniki poniżej 60
  
  // Wyświetl wyniki
  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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Dart online