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']); // 32Para 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.
Desafio
FácilCrie 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:
- Ler uma entrada de texto que represente o nome da empresa
- 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)
- Ler uma entrada de texto que represente o ID de um funcionário para pesquisar
- 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
- Acessar e exibir informações específicas do funcionário usando o acesso a mapas aninhados
- 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 successfullySe 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 successfullySe 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 successfullySeu 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
}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
1Manipulação Avançada de Listas
Propriedades de Lista: first & lastEstado da Lista: isEmpty & isNotEmptyInvertendo uma ListaAdicionando a uma Lista: insertRemoção em Listas: removeWhereBuscando em uma Lista: indexOfOrdenando uma ListaEmbaralhando uma ListaRecapitulação - Organizador de Listas4Manipulação Avançada de Mapas
Iterando sobre um MapVerificando Chaves e ValoresPropriedades do Map: keys & valuesAdição Condicional: putIfAbsentRemovendo Entradas de um MapMaps AninhadosRecapitulação - Atualização de Inventário2Operações Funcionais em Listas
Transformando com 'map'Filtrando com 'where'Usando '.toList()'Verificando Condições com 'any'Condições com 'every'Encontrando com 'firstWhere'Recapitulação - Filtragem de Dados5Projeto: Cálculo de Carrinho de Compras
Configuração do ProjetoAdicionando Itens ao Carrinho3Conjuntos
O que é um Conjunto?Criando um ConjuntoAdicionando e Removendo de ConjuntosVerificando Elementos em um ConjuntoConvertendo uma Lista para um ConjuntoUnião de ConjuntosInterseção de ConjuntosDiferença de ConjuntosRecapitulação - Lista de Convidados ÚnicosPratique por conta própria: Compilador de Dart online