Menu
Coddy logo textTech

Maps Aninhados

Parte da seção Lógica & Fluxo do Journey de Dart da Coddy — lição 31 de 65.

Às vezes, você precisa organizar os dados em uma estrutura hierárquica mais complexa do que um simples par chave-valor. Mapas aninhados permitem que você armazene mapas como valores dentro de outros mapas, criando múltiplos níveis de organização de dados.

Um mapa aninhado é simplesmente um Map onde os valores são eles mesmos objetos Map. Esta estrutura é perfeita para representar dados que possuem categorias e subcategorias, como perfis de usuário com múltiplos detalhes, ou catálogos de produtos com vários atributos.

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

Para acessar dados em um mapa aninhado, você usa múltiplos colchetes. O primeiro conjunto acessa a chave do mapa externo, e o segundo conjunto acessa a chave do mapa interno. Essa estrutura de dois níveis facilita o agrupamento de informações relacionadas, mantendo-as organizadas e acessíveis.

challenge icon

Desafio

Fácil

Crie um programa que gerencie o sistema de diretório de funcionários de uma empresa usando mapas aninhados para armazenar informações detalhadas dos funcionários. Seu programa deve:

  1. Ler uma entrada de string representando o nome da empresa
  2. Ler vários conjuntos de entradas representando dados de funcionários (a entrada terminará quando você receber "employees_done"). Cada funcionário terá:
    • ID do Funcionário (string)
    • Nome (string)
    • Departamento (string)
    • Salário (string que precisa ser convertida para inteiro)
    • Anos de experiência (string que precisa ser convertida para inteiro)
  3. Ler uma entrada de string representando um ID de funcionário para pesquisar
  4. Criar um Map aninhado onde cada ID de funcionário é uma chave, e o valor é outro Map contendo os detalhes do funcionário
  5. Acessar e exibir informações específicas do funcionário usando acesso a mapas aninhados
  6. Calcular estatísticas do departamento e imprimir o relatório do diretório de funcionários no formato exato mostrado abaixo

Por exemplo, se o nome da empresa for "TechCorp Solutions", os dados dos funcionários incluírem "EMP001" com nome "Alice Johnson", departamento "Engineering", salário 75000, experiência 5, "EMP002" com nome "Bob Smith", departamento "Marketing", salário 60000, experiência 3, "EMP003" com nome "Carol Davis", departamento "Engineering", salário 80000, experiência 7, e o ID do funcionário para pesquisar for "EMP001", seu programa deve gerar a saída:

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

Se o nome da empresa for "Global Industries", os dados dos funcionários incluírem "E100" com nome "David Wilson", departamento "Sales", salário 55000, experiência 4, "E101" com nome "Emma Brown", departamento "HR", salário 65000, experiência 6, e o ID do funcionário para pesquisar for "E101", seu programa deve gerar a saída:

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

Se o nome da empresa for "StartupHub", os dados dos funcionários incluírem "S001" com nome "Frank Miller", departamento "Development", salário 70000, experiência 2, "S002" com nome "Grace Lee", departamento "Design", salário 58000, experiência 3, "S003" com nome "Henry Chen", departamento "Development", salário 72000, experiência 4, "S004" com nome "Ivy Taylor", departamento "Marketing", salário 62000, experiência 5, e o ID do funcionário para pesquisar for "S003", seu programa deve gerar a saída:

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

Seu programa deve criar uma estrutura de Map aninhada onde o mapa externo usa IDs de funcionários como chaves, e cada valor é um mapa interno contendo "name", "department", "salary", e "experience" como chaves. Use o acesso a mapas aninhados com colchetes duplos para recuperar informações específicas do funcionário. Conte os funcionários por departamento e calcule o salário médio dividindo a soma total dos salários pelo número de funcionários. O formato de entrada será: nome da empresa, depois conjuntos de cinco valores (ID do funcionário, nome, departamento, salário, experiência) terminando com "employees_done", seguido pelo ID do funcionário para pesquisar.

Folha de consulta

Mapas aninhados permitem que você armazene mapas como valores dentro de outros mapas, criando estruturas de dados hierárquicas:

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

Acesse dados de mapas aninhados usando múltiplos colchetes:

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

O primeiro colchete acessa a chave do mapa externo, o segundo colchete acessa a chave do mapa interno.

Experimente você mesmo

import 'dart:io';

void main() {
  // Ler o nome da empresa
  String? companyName = stdin.readLineSync();
  
  // Inicializar o mapa aninhado para o diretório de funcionários
  Map<String, Map<String, dynamic>> employeeDirectory = {};
  
  // Ler dados dos funcionários até "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();
    
    // Converter salário e experiência para inteiros
    int salary = int.parse(salaryStr!);
    int experience = int.parse(experienceStr!);
    
    // TODO: Criar estrutura de mapa aninhado para cada funcionário e adicionar ao diretório
    
  }
  
  // Ler o ID do funcionário para buscar
  String? lookupId = stdin.readLineSync();
  
  // TODO: Escreva seu código abaixo para:
  // 1. Exibir o nome da empresa e o diretório de funcionários
  // 2. Buscar e exibir informações específicas do funcionário
  // 3. Calcular estatísticas do departamento
  // 4. Calcular a média salarial
  // 5. Imprimir o relatório completo no formato exigido
  
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica & Fluxo