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 múltiples niveles de organización de datos.
Un mapa anidado es simplemente un Map donde los 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 múltiples 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 en un mapa anidado, se utilizan varios corchetes. El primer conjunto accede a la clave del mapa externo y el segundo conjunto accede a la clave del mapa interno. Esta estructura de dos niveles facilita la agrupación de información relacionada, manteniéndola organizada y accesible.
Desafío
FácilCrea un programa que gestione el sistema de directorio de empleados de una empresa utilizando mapas anidados para almacenar información detallada de los empleados. Tu programa debe:
- Leer una entrada de cadena que represente el nombre de la empresa
- Leer múltiples conjuntos de entradas que representen los datos de los empleados (la entrada terminará 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 cadena que represente un ID de empleado para buscar
- Crear un Map anidado donde cada ID de empleado sea una clave, y el valor sea otro Map que contenga los detalles del empleado
- Acceder y mostrar información específica del empleado utilizando el acceso a mapas anidados
- Calcular las estadísticas del 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 "EMP001" con el nombre "Alice Johnson", departamento "Engineering", salario 75000, experiencia 5, "EMP002" con el nombre "Bob Smith", departamento "Marketing", salario 60000, experiencia 3, "EMP003" con el nombre "Carol Davis", departamento "Engineering", salario 80000, experiencia 7, y el ID de empleado a 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 "E100" con el nombre "David Wilson", departamento "Sales", salario 55000, experiencia 4, "E101" con el nombre "Emma Brown", departamento "HR", salario 65000, experiencia 6, y el ID de empleado a 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 "S001" con el nombre "Frank Miller", departamento "Development", salario 70000, experiencia 2, "S002" con el nombre "Grace Lee", departamento "Design", salario 58000, experiencia 3, "S003" con el nombre "Henry Chen", departamento "Development", salario 72000, experiencia 4, "S004" con el nombre "Ivy Taylor", departamento "Marketing", salario 62000, experiencia 5, y el ID de empleado a 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 Map anidada donde el mapa externo use los IDs de los empleados como claves, y cada valor sea un mapa interno que contenga "name", "department", "salary", y "experience" como claves. Utiliza 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) terminando con "employees_done", seguido del ID de empleado a buscar.
Hoja de referencia
Los mapas anidados le permiten almacenar mapas como valores dentro de otros mapas, creando estructuras de datos jerárquicas:
Map<String, Map<String, dynamic>> userProfiles = {
'alice': {
'email': 'alice@example.com',
'age': 28
},
'bob': {
'email': 'bob@example.com',
'age': 32
}
};Acceda a los datos de mapas anidados utilizando múltiples corchetes:
print(userProfiles['alice']['email']); // alice@example.com
print(userProfiles['bob']['age']); // 32El primer corchete accede a la clave del mapa externo, el segundo corchete accede a la clave del mapa interno.
Pruébalo tú mismo
import 'dart:io';
void main() {
// Leer el nombre de la empresa
String? companyName = stdin.readLineSync();
// Inicializar el mapa anidado para el directorio de empleados
Map<String, Map<String, dynamic>> employeeDirectory = {};
// Leer datos de 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();
// Convertir salario y experiencia a enteros
int salary = int.parse(salaryStr!);
int experience = int.parse(experienceStr!);
// TODO: Crear la estructura de mapa anidado para cada empleado y añadir al directorio
}
// Leer el ID del empleado 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 información específica del empleado
// 3. Calcular 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 única