Menu
Coddy logo textTech

Вложенные Map

Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 31 из 65.

Иногда вам нужно организовать данные в более сложную иерархическую структуру, чем простая пара «ключ-значение». Вложенные карты позволяют хранить карты в качестве значений внутри других карт, создавая несколько уровней организации данных.

Вложенная структура Map — это просто 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

Для доступа к данным во вложенной карте используются несколько пар квадратных скобок. Первая пара обращается к ключу внешней карты, а вторая — к ключу внутренней карты. Такая двухуровневая структура позволяет легко группировать связанную информацию, сохраняя её организованной и доступной.

challenge icon

Задание

Легко

Создайте программу, которая управляет системой справочника сотрудников компании, используя вложенные карты (maps) для хранения подробной информации о сотрудниках. Ваша программа должна:

  1. Прочитать строковый ввод, представляющий название компании
  2. Прочитать несколько наборов входных данных, представляющих данные о сотрудниках (ввод закончится, когда вы получите "employees_done"). У каждого сотрудника будут:
    • ID сотрудника (строка)
    • Имя (строка)
    • Отдел (строка)
    • Зарплата (строка, которую необходимо преобразовать в целое число)
    • Стаж работы в годах (строка, которую необходимо преобразовать в целое число)
  3. Прочитать строковый ввод, представляющий ID сотрудника для поиска
  4. Создать вложенную структуру Map, где каждый ID сотрудника является ключом, а значением — другая Map, содержащая данные сотрудника
  5. Получить доступ и отобразить информацию о конкретном сотруднике, используя доступ к вложенной карте
  6. Рассчитать статистику по отделам и вывести отчет справочника сотрудников в точном формате, показанном ниже

Например, если название компании — "TechCorp Solutions", данные о сотрудниках включают "EMP001" с именем "Alice Johnson", отделом "Engineering", зарплатой 75000, стажем 5, "EMP002" с именем "Bob Smith", отделом "Marketing", зарплатой 60000, стажем 3, "EMP003" с именем "Carol Davis", отделом "Engineering", зарплатой 80000, стажем 7, а 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", данные о сотрудниках включают "E100" с именем "David Wilson", отделом "Sales", зарплатой 55000, стажем 4, "E101" с именем "Emma Brown", отделом "HR", зарплатой 65000, стажем 6, а 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", данные о сотрудниках включают "S001" с именем "Frank Miller", отделом "Development", зарплатой 70000, стажем 2, "S002" с именем "Grace Lee", отделом "Design", зарплатой 58000, стажем 3, "S003" с именем "Henry Chen", отделом "Development", зарплатой 72000, стажем 4, "S004" с именем "Ivy Taylor", отделом "Marketing", зарплатой 62000, стажем 5, а 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

Ваша программа должна создать вложенную структуру Map, где внешняя карта использует ID сотрудников в качестве ключей, а каждое значение является внутренней картой, содержащей ключи "name", "department", "salary" и "experience". Используйте доступ к вложенной карте с двойными квадратными скобками для получения информации о конкретном сотруднике. Подсчитайте количество сотрудников по отделам и вычислите среднюю зарплату, разделив общую сумму зарплат на количество сотрудников. Формат ввода будет следующим: название компании, затем наборы из пяти значений (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

Первая скобка обращается к ключу внешней карты, вторая скобка — к ключу внутренней карты.

Попробуйте сами

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Проверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком