Mapas anidados
Parte de la sección Lógica y Flujo del Journey de Dart de Coddy. Lección 31 de 65.
A veces necesitas organizar los datos en una estructura jerárquica más compleja que un simple par clave-valor. Los mapas anidados te permiten almacenar mapas como valores dentro de otros mapas, creando varios niveles de organización de datos.
Un mapa anidado es simplemente un Map cuyos valores son a su vez objetos Map. Esta estructura es perfecta para representar datos que tienen categorías y subcategorías, como perfiles de usuario con varios detalles o catálogos de productos con 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 acceder a los datos de un mapa anidado, se usan varios corchetes. El primer par accede a la clave del mapa externo, y el segundo par accede a la clave del mapa interno. Una búsqueda en un mapa devuelve null cuando falta la clave, así que Dart necesita un ! después de la primera búsqueda cuando sabes que la clave existe: userProfiles['alice']!['email']. Esta estructura de dos niveles facilita agrupar información relacionada y mantenerla organizada y accesible.
Desafío
FácilCrea un programa que gestione el sistema de directorio de empleados de una empresa mediante mapas anidados para almacenar información detallada de los empleados. Tu programa debe:
- Leer una entrada de tipo cadena que represente el nombre de la empresa
- Leer varios conjuntos de entradas que representen los datos de los empleados (la entrada finalizará cuando recibas
"employees_done"). Cada empleado tendrá:- ID de empleado (cadena)
- Nombre (cadena)
- Departamento (cadena)
- Salario (cadena que debe convertirse a entero)
- Años de experiencia (cadena que debe convertirse a entero)
- Leer una entrada de tipo cadena que represente el ID del empleado que se buscará
- Crear un mapa anidado en el que cada ID de empleado sea una clave y el valor sea otro mapa que contenga los detalles del empleado
- Acceder y mostrar información específica del empleado mediante el acceso a mapas anidados
- Calcular las estadísticas por departamento e imprimir el informe del directorio de empleados en el formato exacto que se muestra a continuación
Por ejemplo, si el nombre de la empresa es "TechCorp Solutions", los datos de los empleados incluyen a "EMP001" con el nombre "Alice Johnson", el departamento "Engineering", el salario 75000 y la experiencia 5; a "EMP002" con el nombre "Bob Smith", el departamento "Marketing", el salario 60000 y la experiencia 3; a "EMP003" con el nombre "Carol Davis", el departamento "Engineering", el salario 80000 y la experiencia 7; y el ID del empleado que se buscará es "EMP001", tu programa debería mostrar:
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 successfullySi el nombre de la empresa es "Global Industries", los datos de los empleados incluyen a "E100" con el nombre "David Wilson", el departamento "Sales", el salario 55000 y la experiencia 4; a "E101" con el nombre "Emma Brown", el departamento "HR", el salario 65000 y la experiencia 6; y el ID del empleado que se buscará es "E101", tu programa debería mostrar:
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 successfullySi el nombre de la empresa es "StartupHub", los datos de los empleados incluyen a "S001" con el nombre "Frank Miller", el departamento "Development", el salario 70000 y la experiencia 2; a "S002" con el nombre "Grace Lee", el departamento "Design", el salario 58000 y la experiencia 3; a "S003" con el nombre "Henry Chen", el departamento "Development", el salario 72000 y la experiencia 4; a "S004" con el nombre "Ivy Taylor", el departamento "Marketing", el salario 62000 y la experiencia 5; y el ID del empleado que se buscará es "S003", tu programa debería mostrar:
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 successfullyTu programa debe crear una estructura de mapas anidados en la que el mapa externo use los ID de empleado como claves y cada valor sea un mapa interno que contenga "name", "department", "salary" y "experience" como claves. Usa el acceso a mapas anidados con corchetes dobles para recuperar información específica de los empleados. Cuenta los empleados por departamento y calcula el salario promedio dividiendo la suma total de los salarios por el número de empleados. El formato de entrada será: nombre de la empresa, luego conjuntos de cinco valores (ID de empleado, nombre, departamento, salario, experiencia) que terminan con "employees_done", seguidos del ID del empleado que se buscará.
Pruébalo tú mismo
import 'dart:io';
void main() {
// Lee el nombre de la empresa
String? companyName = stdin.readLineSync();
// Inicializa un mapa anidado para el directorio de empleados
Map<String, Map<String, dynamic>> employeeDirectory = {};
// Lee los datos de los empleados hasta "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();
// Convierte el salario y la experiencia a números enteros
int salary = int.parse(salaryStr!);
int experience = int.parse(experienceStr!);
// TODO: Crea una estructura de mapa anidado para cada empleado y añádela al directorio
}
// Lee el ID del empleado que se va a buscar
String? lookupId = stdin.readLineSync();
// TODO: Escribe tu código a continuación para:
// 1. Mostrar el nombre de la empresa y el directorio de empleados
// 2. Buscar y mostrar la información de un empleado específico
// 3. Calcular las estadísticas por departamento
// 4. Calcular el salario promedio
// 5. Imprimir el informe completo en el formato requerido
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Manipulación avanzada de listas
Propiedades de listas: first y lastEstado de la lista: isEmpty y isNotEmptyInvertir una listaAñadir a una lista: insertEliminación en listas: removeWhereBúsqueda en una lista: indexOfOrdenar una listaMezclar una listaResumen - Organizador de listas4Manipulación avanzada de mapas
Iterar sobre un mapaComprobación de claves y valoresPropiedades del mapa: keys y valuesAdición condicional: putIfAbsentEliminar entradas de un mapaMapas anidadosResumen - Actualización de inventario2Operaciones funcionales con listas
Transformar con 'map'Filtrar con 'where'Uso de '.toList()'Comprobar condiciones con 'any'Condiciones con 'every'Búsqueda con 'firstWhere'Resumen - Filtrado de datos5Proyecto: Calculadora de carrito de compras
Configuración del proyectoAgregar artículos al carrito3Conjuntos
¿Qué es un Conjunto?Crear un ConjuntoAñadir y eliminar elementos de un ConjuntoComprobar elementos en un ConjuntoConvertir una lista en un ConjuntoUnión de ConjuntosIntersección de ConjuntosDiferencia de ConjuntosResumen - Lista de invitados únicaPractica por tu cuenta: Compilador de Dart online