Menu
CoddyTech

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']);      // 32

Para 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.

challenge icon

Desafío

Fácil

Crea 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:

  1. Leer una entrada de tipo cadena que represente el nombre de la empresa
  2. 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)
  3. Leer una entrada de tipo cadena que represente el ID del empleado que se buscará
  4. 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
  5. Acceder y mostrar información específica del empleado mediante el acceso a mapas anidados
  6. 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 successfully

Si 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 successfully

Si 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 successfully

Tu 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
  
}
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de Dart online