Menu
Coddy logo textTech

ネストされたMap

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

単純なキー・バリュー・ペアよりも複雑で階層的な構造でデータを整理する必要がある場合があります。ネストされたマップを使用すると、マップを別のマップ内の値として保存でき、複数レベルのデータ整理が可能になります。

ネストされたマップとは、値自体が Map オブジェクトである Map のことです。この構造は、複数の詳細情報を持つユーザープロファイルや、さまざまな属性を持つ製品カタログなど、カテゴリとサブカテゴリを持つデータを表現するのに最適です。

Map<String, Map<String, dynamic>> userProfiles = {
  'alice': {
    'email': 'alice@example.com',
    'age': 28
  },
  'bob': {
    'email': 'bob@example.com',
    'age': 32
  }
};

print(userProfiles['alice']['email']);  // alice@example.com
print(userProfiles['bob']['age']);      // 32

ネストされたマップ内のデータにアクセスするには、複数の角括弧を使用します。最初のセットは外側のマップのキーにアクセスし、2番目のセットは内側のマップのキーにアクセスします。この2レベルの構造により、関連する情報を整理してアクセス可能な状態に保ちながら、簡単にグループ化することができます。

challenge icon

チャレンジ

簡単

ネストされたマップを使用して詳細な従業員情報を保存する、会社の従業員名簿システムを管理するプログラムを作成してください。プログラムは以下の処理を行う必要があります:

  1. 会社名を表す文字列入力を読み込む
  2. 従業員データの複数の入力セットを読み込む(入力は "employees_done" を受け取った時点で終了します)。各従業員は以下の情報を持ちます:
    • 従業員ID(文字列)
    • 名前(文字列)
    • 部署(文字列)
    • 給与(整数に変換する必要がある文字列)
    • 経験年数(整数に変換する必要がある文字列)
  3. 検索する従業員IDを表す文字列入力を読み込む
  4. 各従業員IDをキーとし、値に従業員の詳細を含む別のマップを持つネストされたマップを作成する
  5. ネストされたマップへのアクセスを使用して、特定の従業員情報にアクセスし表示する
  6. 部署ごとの統計を計算し、以下に示す正確な形式で従業員名簿レポートを出力する

例えば、会社名が "TechCorp Solutions" で、従業員データに名前 "Alice Johnson"、部署 "Engineering"、給与 75000、経験 5"EMP001"、名前 "Bob Smith"、部署 "Marketing"、給与 60000、経験 3"EMP002"、名前 "Carol Davis"、部署 "Engineering"、給与 80000、経験 7"EMP003" が含まれ、検索する従業員IDが "EMP001" の場合、プログラムは以下のように出力する必要があります:

Company: TechCorp Solutions
Employee Directory: {EMP001: {name: Alice Johnson, department: Engineering, salary: 75000, experience: 5}, EMP002: {name: Bob Smith, department: Marketing, salary: 60000, experience: 3}, EMP003: {name: Carol Davis, department: Engineering, salary: 80000, experience: 7}}
Employee Lookup (EMP001):
Name: Alice Johnson
Department: Engineering
Salary: $75000
Experience: 5 years
Department Analysis:
Engineering employees: 2
Marketing employees: 1
Total employees: 3
Average salary: $71666
Status: Employee directory processed successfully

会社名が "Global Industries" で、従業員データに名前 "David Wilson"、部署 "Sales"、給与 55000、経験 4"E100"、名前 "Emma Brown"、部署 "HR"、給与 65000、経験 6"E101" が含まれ、検索する従業員IDが "E101" の場合、プログラムは以下のように出力する必要があります:

Company: Global Industries
Employee Directory: {E100: {name: David Wilson, department: Sales, salary: 55000, experience: 4}, E101: {name: Emma Brown, department: HR, salary: 65000, experience: 6}}
Employee Lookup (E101):
Name: Emma Brown
Department: HR
Salary: $65000
Experience: 6 years
Department Analysis:
Sales employees: 1
HR employees: 1
Total employees: 2
Average salary: $60000
Status: Employee directory processed successfully

会社名が "StartupHub" で、従業員データに名前 "Frank Miller"、部署 "Development"、給与 70000、経験 2"S001"、名前 "Grace Lee"、部署 "Design"、給与 58000、経験 3"S002"、名前 "Henry Chen"、部署 "Development"、給与 72000、経験 4"S003"、名前 "Ivy Taylor"、部署 "Marketing"、給与 62000、経験 5"S004" が含まれ、検索する従業員IDが "S003" の場合、プログラムは以下のように出力する必要があります:

Company: StartupHub
Employee Directory: {S001: {name: Frank Miller, department: Development, salary: 70000, experience: 2}, S002: {name: Grace Lee, department: Design, salary: 58000, experience: 3}, S003: {name: Henry Chen, department: Development, salary: 72000, experience: 4}, S004: {name: Ivy Taylor, department: Marketing, salary: 62000, experience: 5}}
Employee Lookup (S003):
Name: Henry Chen
Department: Development
Salary: $72000
Experience: 4 years
Department Analysis:
Development employees: 2
Design employees: 1
Marketing employees: 1
Total employees: 4
Average salary: $65500
Status: Employee directory processed successfully

プログラムは、外側のマップが従業員IDをキーとして使用し、各値が "name""department""salary""experience" をキーとして持つ内側のマップであるネストされたマップ構造を作成する必要があります。特定の従業員情報を取得するには、二重の角括弧を使用したネストされたマップアクセスを使用してください。部署ごとの従業員数をカウントし、給与の総和を従業員数で割って平均給与を計算します。入力形式は、会社名、次に5つの値のセット(従業員ID、名前、部署、給与、経験)が続き、"employees_done" で終了し、最後に検索する従業員IDが入力されます。

チートシート

ネストされたマップを使用すると、マップを別のマップ内の値として保存でき、階層的なデータ構造を作成できます。

Map<String, Map<String, dynamic>> userProfiles = {
  'alice': {
    'email': 'alice@example.com',
    'age': 28
  },
  'bob': {
    'email': 'bob@example.com',
    'age': 32
  }
};

複数の角括弧を使用して、ネストされたマップのデータにアクセスします。

print(userProfiles['alice']['email']);  // alice@example.com
print(userProfiles['bob']['age']);      // 32

最初の括弧は外側のマップのキーにアクセスし、2番目の括弧は内側のマップのキーにアクセスします。

自分で試してみよう

import 'dart:io';

void main() {
  // 会社名を読み込む
  String? companyName = stdin.readLineSync();
  
  // 従業員ディレクトリ用のネストされたマップを初期化する
  Map<String, Map<String, dynamic>> employeeDirectory = {};
  
  // "employees_done" が入力されるまで従業員データを読み込む
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "employees_done") {
      break;
    }
    
    String employeeId = input!;
    String? name = stdin.readLineSync();
    String? department = stdin.readLineSync();
    String? salaryStr = stdin.readLineSync();
    String? experienceStr = stdin.readLineSync();
    
    // 給与と経験年数を整数に変換する
    int salary = int.parse(salaryStr!);
    int experience = int.parse(experienceStr!);
    
    // TODO: 各従業員のネストされたマップ構造を作成し、ディレクトリに追加する
    
  }
  
  // 検索する従業員IDを読み込む
  String? lookupId = stdin.readLineSync();
  
  // TODO: 以下にコードを記述して、次の処理を行ってください:
  // 1. 会社名と従業員ディレクトリを表示する
  // 2. 特定の従業員情報を検索して表示する
  // 3. 部署の統計を計算する
  // 4. 平均給与を計算する
  // 5. 必要な形式で完全なレポートを出力する
  
}
quiz icon腕試し

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

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