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']); // 32Para 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.
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 dos funcionários. Seu programa deve:
- Ler uma entrada de string representando o nome da empresa
- 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)
- Ler uma entrada de string representando um ID de funcionário para pesquisar
- Criar um Map aninhado onde cada ID de funcionário é uma chave, e o valor é outro Map contendo os detalhes do funcionário
- Acessar e exibir informações específicas do funcionário usando acesso a mapas aninhados
- 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 successfullySe 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 successfullySe 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 successfullySeu 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']); // 32O 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
}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 Únicos