Menu
Coddy logo textTech

'.toList()' の使用

CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 12/65。

リストに対して map()where() のようなメソッドを使用すると、それらは新しい List を返すのではなく、Iterable を返します。Iterable には、目的の変換またはフィルタリングされたデータが含まれていますが、使い慣れたリストのメソッドやプロパティを使用するために、多くの場合、それを List に戻す必要があります。

.toList() メソッドは、IterableList に戻します。この変換により、イテラブルのすべての要素を含む新しいリストが作成され、使い慣れたすべての標準的なリスト操作にアクセスできるようになります。

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

// where() は List ではなく Iterable を返します
var longWordsIterable = words.where((word) => word.length > 5);

// Iterable を List に変換します
List<String> longWordsList = longWordsIterable.toList();
print(longWordsList);  // ['banana', 'cherry']

この変換ステップは、フィルタリングまたは変換されたデータに対して追加のリスト操作を行う必要がある場合に不可欠です。.toList() がないと、完全な List よりも機能が制限されている Iterable を操作することになります。

challenge icon

チャレンジ

簡単

ジャンルの好みに基づいて本をフィルタリングし、その結果を適切なリスト形式に変換することで、図書館の書籍推薦システムを管理するプログラムを作成してください。プログラムは以下の手順で行う必要があります:

  1. 図書館名を表す文字列入力を読み込む
  2. 本のタイトルを表す複数の文字列入力を読み込む(空の文字列を受け取ると入力は終了します)
  3. 各タイトルに対応する本のジャンルを表す複数の文字列入力を読み込む(空の文字列を受け取ると入力は終了します)
  4. フィルタリングの基準となる、好みのジャンルを表す文字列入力を読み込む
  5. where() メソッドを使用して、好みのジャンルに一致する本をフィルタリングする
  6. toList() メソッドを使用して、フィルタリングされたイテラブルを適切なリストに変換する
  7. 以下の形式で推薦結果を出力する

例えば、図書館名が "City Library"、本が "The Great Gatsby", "Dune", "Pride and Prejudice", "1984"、ジャンルが "Fiction", "Science Fiction", "Romance", "Fiction"、そして好みのジャンルが "Fiction" の場合、プログラムは以下のように出力する必要があります:

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

図書館名が "School Library"、本が "Harry Potter", "Lord of the Rings"、ジャンルが "Fantasy", "Fantasy"、そして好みのジャンルが "Mystery" の場合、プログラムは以下のように出力する必要があります:

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

図書館名が "Community Library"、本が "To Kill a Mockingbird"、ジャンルが "Classic"、そして好みのジャンルが "Classic" の場合、プログラムは以下のように出力する必要があります:

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

プログラムでは、where() メソッドを使用して本のジャンルと好みのジャンルを照合してフィルタリングし、次に toList() メソッドを使用して結果のイテラブルをリストに変換する必要があります。フィルタリングされたイテラブルは丸括弧形式で表示し、最終的なリストは角括弧形式で表示する必要があります。

チートシート

map()where() のようなメソッドは、List ではなく Iterable を返します。IterableList に戻すには、.toList() を使用します:

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

// where() は List ではなく Iterable を返します
var longWordsIterable = words.where((word) => word.length > 5);

// Iterable を List に変換します
List<String> longWordsList = longWordsIterable.toList();
print(longWordsList);  // ['banana', 'cherry']

この変換は、フィルタリングまたは変換されたデータに対して追加のリスト操作を実行する必要がある場合に不可欠です。

自分で試してみよう

import 'dart:io';

void main() {
  // 図書館名を読み込む
  String? libraryName = stdin.readLineSync();
  
  // 空の文字列が入力されるまで本のタイトルを読み込む
  List<String> books = [];
  while (true) {
    String? book = stdin.readLineSync();
    if (book == null || book.isEmpty) break;
    books.add(book);
  }
  
  // 空の文字列が入力されるまで本のジャンルを読み込む
  List<String> genres = [];
  while (true) {
    String? genre = stdin.readLineSync();
    if (genre == null || genre.isEmpty) break;
    genres.add(genre);
  }
  
  // 好みのジャンルを読み込む
  String? preferredGenre = stdin.readLineSync();
  
  // TODO: 以下にコードを記述してください
  // where() メソッドを使用して、好みのジャンルで本をフィルタリングします
  // toList() メソッドを使用して、フィルタリングされた反復可能オブジェクトをリストに変換します
  
  // 必要な形式で結果を出力します
  print('Library: $libraryName');
  print('All books: $books');
  print('All genres: $genres');
  print('Filtering by genre: $preferredGenre');
  // フィルタリングされた本(反復可能オブジェクト)とおすすめの本(リスト)を出力します
  // おすすめの総数とステータスを出力します
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理とフローのすべてのレッスン