Menu
Coddy logo textTech

Mapのプロパティ: keys と values

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

Map コレクションを扱う際、すべてのキーまたはすべての値を個別に抽出する必要がある場合があります。Dart はこれに対して 2 つの便利なプロパティ、.keys.values を提供しています。

.keysプロパティは、マップ内のすべてのキーを含むイテラブルを返します。一方、.valuesは、対応するすべての値を含むイテラブルを返します。これらのプロパティは、キーと値を個別に処理する必要がある場合に特に便利です。

Map<String, double> inventory = {
  'Laptop': 999.99,
  'Mouse': 25.50,
  'Keyboard': 75.00
};

Iterable<String> productNames = inventory.keys;
Iterable<double> prices = inventory.values;

print(productNames);  // (Laptop, Mouse, Keyboard)
print(prices);        // (999.99, 25.5, 75.0)

これらのプロパティはリストではなくイテラブル(反復可能オブジェクト)を返すため、リスト固有の機能が必要な場合は .toList() を使用してリストに変換できます。このようにキーと値を分離することは、データの一方の側面を他方から独立して分析または操作する必要がある場合に特に役立ちます。

challenge icon

チャレンジ

簡単

蔵書を分析し、タイトルとその出版年に関する情報を抽出することで、デジタル図書館システムを管理するプログラムを作成してください。プログラムは以下の手順を実行する必要があります:

  1. 図書館名を表す文字列の入力を読み込む
  2. 本のタイトルとその出版年を表す複数の入力ペアを読み込む(入力は "catalog_done" を受け取った時点で終了します)
  3. 各本のタイトルをキー、出版年を値として保存する Map を作成する
  4. .keys プロパティを使用してすべての本のタイトルを抽出し、List に変換する
  5. .values プロパティを使用してすべての出版年を抽出し、List に変換する
  6. 値の中から最小の年を特定して、最も古い本を見つける
  7. 値の中から最大の年を特定して、最も新しい本を見つける
  8. 以下の形式で図書館の分析結果を出力する

例えば、図書館名が "Central Library" で、カタログに "To Kill a Mockingbird"(1960年)、"1984"(1949年)、"The Great Gatsby"(1925年)、"Harry Potter"(1997年)が含まれている場合、プログラムは以下のように出力する必要があります:

Library: Central Library
Book Collection Analysis:
All book titles: [To Kill a Mockingbird, 1984, The Great Gatsby, Harry Potter]
All publication years: [1960, 1949, 1925, 1997]
Total books in collection: 4
Oldest book year: 1925
Newest book year: 1997
Collection span: 72 years
Status: Library catalog analysis completed

図書館名が "University Library" で、カタログに "Pride and Prejudice"(1813年)、"Moby Dick"(1851年)、"Brave New World"(1932年)が含まれている場合、プログラムは以下のように出力する必要があります:

Library: University Library
Book Collection Analysis:
All book titles: [Pride and Prejudice, Moby Dick, Brave New World]
All publication years: [1813, 1851, 1932]
Total books in collection: 3
Oldest book year: 1813
Newest book year: 1932
Collection span: 119 years
Status: Library catalog analysis completed

図書館名が "Community Library" で、カタログに "The Hobbit"(1937年)、"Dune"(1965年)、"Neuromancer"(1984年)、"The Martian"(2011年)、"Klara and the Sun"(2021年)が含まれている場合、プログラムは以下のように出力する必要があります:

Library: Community Library
Book Collection Analysis:
All book titles: [The Hobbit, Dune, Neuromancer, The Martian, Klara and the Sun]
All publication years: [1937, 1965, 1984, 2011, 2021]
Total books in collection: 5
Oldest book year: 1937
Newest book year: 2021
Collection span: 84 years
Status: Library catalog analysis completed

プログラムでは、.keys プロパティを使用してすべての本のタイトルを抽出し、.values プロパティを使用してすべての出版年を抽出する必要があります。両方の反復可能オブジェクト(iterable)を .toList() を使用して List に変換してください。最新の年から最古の年を引くことで、コレクションの期間(collection span)を計算します。入力形式は、図書館名、次に本のタイトルと出版年(整数に変換する必要がある文字列として)が交互に続き、最後に "catalog_done" が入力されます。

チートシート

Map からすべてのキーを抽出するには .keys を使用し、すべての値を抽出するには .values を使用します。

Map<String, double> inventory = {
  'Laptop': 999.99,
  'Mouse': 25.50,
  'Keyboard': 75.00
};

Iterable<String> productNames = inventory.keys;
Iterable<double> prices = inventory.values;

print(productNames);  // (Laptop, Mouse, Keyboard)
print(prices);        // (999.99, 25.5, 75.0)

リスト固有の機能を使用するために、.toList() を使用して Iterable をリストに変換します。

List<String> namesList = inventory.keys.toList();
List<double> pricesList = inventory.values.toList();

自分で試してみよう

import 'dart:io';

void main() {
  // 図書館名を読み込む
  String? libraryName = stdin.readLineSync();
  
  // 本のタイトルと出版年を保存するためのMapを作成する
  Map<String, int> bookCatalog = {};
  
  // "catalog_done"が入力されるまで、本のタイトルと出版年を読み込む
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "catalog_done") {
      break;
    }
    String bookTitle = input!;
    String? yearInput = stdin.readLineSync();
    int publicationYear = int.parse(yearInput!);
    bookCatalog[bookTitle] = publicationYear;
  }
  
  // TODO: 以下にコードを記述してください
  // .keysプロパティを使用して本のタイトルを抽出し、Listに変換する
  // .valuesプロパティを使用して出版年を抽出し、Listに変換する
  // 最古と最新の出版年を見つける
  // コレクションの期間を計算する
  // 必要な形式で図書館の分析結果を出力する
  
  print("Library: $libraryName");
  print("Book Collection Analysis:");
  // ここに出力ステートメントを追加してください
}
quiz icon腕試し

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

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