Menu
Coddy logo textTech

Używanie '.toList()'

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

Gdy używasz metod takich jak map() i where() na liście, nie zwracają one nowej List — zwracają Iterable. Chociaż Iterable zawiera przekształcone lub przefiltrowane dane, których potrzebujesz, często trzeba przekonwertować je z powrotem na List, aby korzystać ze znanych metod i właściwości list.

Metoda .toList() przekształca obiekt Iterable z powrotem w List. To przekształcenie tworzy nową listę zawierającą wszystkie elementy z obiektu iterowalnego, dając Ci dostęp do wszystkich standardowych operacji na listach, do których jesteś przyzwyczajony.

List<String> words = ['apple', 'banana', 'cherry', 'date'];

// where() zwraca Iterable, a nie List
var longWordsIterable = words.where((word) => word.length > 5);

// Przekształć Iterable w List
List<String> longWordsList = longWordsIterable.toList();
print(longWordsList);  // ['banana', 'cherry']

Ten etap konwersji jest niezbędny, gdy chcesz wykonać dodatkowe operacje na liście przefiltrowanych lub przekształconych danych. Bez .toList() pracowałbyś z obiektem Iterable, który ma bardziej ograniczoną funkcjonalność niż pełna List.

challenge icon

Wyzwanie

Łatwy

Utwórz program zarządzający systemem rekomendacji książek w bibliotece, który filtruje książki na podstawie preferencji gatunkowych i konwertuje wyniki na odpowiedni format listy. Twój program powinien:

  1. Odczytać ciąg znaków reprezentujący nazwę biblioteki
  2. Odczytać wiele ciągów znaków reprezentujących tytuły książek (wprowadzanie zakończy się po otrzymaniu pustego ciągu znaków)
  3. Odczytać wiele ciągów znaków reprezentujących gatunki książek odpowiadające poszczególnym tytułom (wprowadzanie zakończy się po otrzymaniu pustego ciągu znaków)
  4. Odczytać ciąg znaków reprezentujący preferowany gatunek, według którego należy filtrować
  5. Użyć metody where(), aby przefiltrować książki pasujące do preferowanego gatunku
  6. Użyć metody toList(), aby przekonwertować przefiltrowany obiekt iterowalny na odpowiednią listę
  7. Wyświetlić wyniki rekomendacji w dokładnie takim formacie, jak pokazano poniżej

Na przykład, jeśli nazwa biblioteki to "City Library", książki to "The Great Gatsby", "Dune", "Pride and Prejudice", "1984", gatunki to "Fiction", "Science Fiction", "Romance", "Fiction", a preferowany gatunek to "Fiction", program powinien wyświetlić:

Library: City Library
All books: [The Great Gatsby, Dune, Pride and Prejudice, 1984]
All genres: [Fiction, Science Fiction, Romance, Fiction]
Filtering by genre: Fiction
Filtered books (iterable): (The Great Gatsby, 1984)
Recommended books (list): [The Great Gatsby, 1984]
Total recommendations: 2
Status: Recommendations ready

Jeśli nazwa biblioteki to "School Library", książki to "Harry Potter", "Lord of the Rings", gatunki to "Fantasy", "Fantasy", a preferowany gatunek to "Mystery", program powinien wyświetlić:

Library: School Library
All books: [Harry Potter, Lord of the Rings]
All genres: [Fantasy, Fantasy]
Filtering by genre: Mystery
Filtered books (iterable): ()
Recommended books (list): []
Total recommendations: 0
Status: Recommendations ready

Jeśli nazwa biblioteki to "Community Library", książka to "To Kill a Mockingbird", gatunek to "Classic", a preferowany gatunek to "Classic", program powinien wyświetlić:

Library: Community Library
All books: [To Kill a Mockingbird]
All genres: [Classic]
Filtering by genre: Classic
Filtered books (iterable): (To Kill a Mockingbird)
Recommended books (list): [To Kill a Mockingbird]
Total recommendations: 1
Status: Recommendations ready

Twój program musi używać metody where(), aby filtrować książki przez dopasowanie ich gatunku do preferowanego gatunku, a następnie użyć metody toList(), aby przekonwertować wynikowy obiekt iterowalny na listę. Przefiltrowany obiekt iterowalny powinien być wyświetlony w nawiasach okrągłych, a końcowa lista — w nawiasach kwadratowych.

Spróbuj swoich sił

import 'dart:io';

void main() {
  // Wczytaj nazwę biblioteki
  String? libraryName = stdin.readLineSync();
  
  // Wczytuj tytuły książek aż do napotkania pustego ciągu znaków
  List<String> books = [];
  while (true) {
    String? book = stdin.readLineSync();
    if (book == null || book.isEmpty) break;
    books.add(book);
  }
  
  // Wczytuj gatunki książek aż do napotkania pustego ciągu znaków
  List<String> genres = [];
  while (true) {
    String? genre = stdin.readLineSync();
    if (genre == null || genre.isEmpty) break;
    genres.add(genre);
  }
  
  // Wczytaj preferowany gatunek
  String? preferredGenre = stdin.readLineSync();
  
  // TODO: Napisz swój kod poniżej
  // Użyj metody where(), aby filtrować książki według preferowanego gatunku
  // Użyj metody toList(), aby przekształcić przefiltrowany obiekt iterowalny w listę
  
  // Wyświetl wyniki w wymaganym formacie
  print('Library: $libraryName');
  print('All books: $books');
  print('All genres: $genres');
  print('Filtering by genre: $preferredGenre');
  // Wyświetl przefiltrowane książki (obiekt iterowalny) i polecane książki (lista)
  // Wyświetl łączną liczbę rekomendacji i status
}
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