Menu
CoddyTech

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 dados em uma estrutura hierárquica mais complexa do que um simples par chave-valor. Mapas aninhados permitem armazenar mapas como valores dentro de outros mapas, criando vários níveis de organização de dados.

Um mapa aninhado é simplesmente um Map em que os valores são, por sua vez, objetos Map. Essa estrutura é perfeita para representar dados que têm categorias e subcategorias, como perfis de usuários com vários detalhes ou catálogos de produtos com diversos 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 vários colchetes. O primeiro conjunto acessa a chave do mapa externo, e o segundo conjunto acessa a chave do mapa interno. Uma consulta ao mapa retorna null quando a chave não existe, então o Dart precisa de um ! após a primeira consulta quando você sabe que a chave existe: userProfiles['alice']!['email']. Essa estrutura de dois níveis facilita agrupar 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 sobre os funcionários. Seu programa deve:

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

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

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 o nome "David Wilson", departamento "Sales", salário 55000, experiência 4, "E101" com o nome "Emma Brown", departamento "HR", salário 65000, experiência 6, e o ID do funcionário a pesquisar for "E101", seu programa deverá produzir:

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 o nome "Frank Miller", departamento "Development", salário 70000, experiência 2, "S002" com o nome "Grace Lee", departamento "Design", salário 58000, experiência 3, "S003" com o nome "Henry Chen", departamento "Development", salário 72000, experiência 4, "S004" com o nome "Ivy Taylor", departamento "Marketing", salário 62000, experiência 5, e o ID do funcionário a pesquisar for "S003", seu programa deverá produzir:

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 aninhado em que o mapa externo use os IDs dos funcionários como chaves, e cada valor seja 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 dos funcionários. 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 da entrada será: nome da empresa, depois conjuntos de cinco valores (ID do funcionário, nome, departamento, salário, experiência) terminando com "employees_done", seguidos pelo ID do funcionário a pesquisar.

Experimente você mesmo

import 'dart:io';

void main() {
  // Leia o nome da empresa
  String? companyName = stdin.readLineSync();
  
  // Inicialize o mapa aninhado para o diretório de funcionários
  Map<String, Map<String, dynamic>> employeeDirectory = {};
  
  // Leia os 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();
    
    // Converta o salário e o tempo de experiência em números inteiros
    int salary = int.parse(salaryStr!);
    int experience = int.parse(experienceStr!);
    
    // TODO: Crie uma estrutura de mapa aninhado para cada funcionário e adicione-a ao diretório
    
  }
  
  // Leia o ID do funcionário a ser consultado
  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. Consultar e exibir as informações de um funcionário específico
  // 3. Calcular as estatísticas por departamento
  // 4. Calcular o salário médio
  // 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

Pratique por conta própria: Compilador de Dart online