Menu
Coddy logo textTech

Mappe annidate

Fa parte della sezione Logica e flusso del percorso Dart di Coddy. Lezione 31 di 65.

A volte è necessario organizzare i dati in una struttura gerarchica più complessa rispetto a una semplice coppia chiave-valore. Le mappe annidate consentono di memorizzare mappe come valori all'interno di altre mappe, creando più livelli di organizzazione dei dati.

Una mappa annidata è semplicemente una Map i cui valori sono a loro volta oggetti Map. Questa struttura è perfetta per rappresentare dati con categorie e sottocategorie, come i profili utente con più dettagli o i cataloghi di prodotti con vari attributi.

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

Per accedere ai dati in una mappa annidata, usa più parentesi quadre. La prima coppia consente di accedere alla chiave della mappa esterna e la seconda alla chiave della mappa interna. Questa struttura a due livelli semplifica il raggruppamento delle informazioni correlate, mantenendole organizzate e accessibili.

challenge icon

Sfida

Facile

Crea un programma che gestisca il sistema di directory dei dipendenti di un'azienda usando mappe annidate per memorizzare informazioni dettagliate sui dipendenti. Il tuo programma deve:

  1. Leggere una stringa che rappresenta il nome dell'azienda
  2. Leggere più gruppi di input che rappresentano i dati dei dipendenti (l'input terminerà quando riceverai "employees_done"). Ogni dipendente avrà:
    • ID dipendente (stringa)
    • Nome (stringa)
    • Reparto (stringa)
    • Stipendio (stringa da convertire in intero)
    • Anni di esperienza (stringa da convertire in intero)
  3. Leggere una stringa che rappresenta l'ID del dipendente da cercare
  4. Creare una Map annidata in cui ogni ID dipendente è una chiave e il valore è un'altra Map contenente i dettagli del dipendente
  5. Accedere e visualizzare informazioni specifiche del dipendente usando l'accesso a mappe annidate
  6. Calcolare le statistiche dei reparti e stampare il rapporto della directory dei dipendenti nel formato esatto mostrato di seguito

Per esempio, se il nome dell'azienda è "TechCorp Solutions", i dati dei dipendenti includono "EMP001" con nome "Alice Johnson", reparto "Engineering", stipendio 75000, esperienza 5, "EMP002" con nome "Bob Smith", reparto "Marketing", stipendio 60000, esperienza 3, "EMP003" con nome "Carol Davis", reparto "Engineering", stipendio 80000, esperienza 7, e l'ID del dipendente da cercare è "EMP001", il tuo programma dovrebbe produrre:

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

Se il nome dell'azienda è "Global Industries", i dati dei dipendenti includono "E100" con nome "David Wilson", reparto "Sales", stipendio 55000, esperienza 4, "E101" con nome "Emma Brown", reparto "HR", stipendio 65000, esperienza 6, e l'ID del dipendente da cercare è "E101", il tuo programma dovrebbe produrre:

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

Se il nome dell'azienda è "StartupHub", i dati dei dipendenti includono "S001" con nome "Frank Miller", reparto "Development", stipendio 70000, esperienza 2, "S002" con nome "Grace Lee", reparto "Design", stipendio 58000, esperienza 3, "S003" con nome "Henry Chen", reparto "Development", stipendio 72000, esperienza 4, "S004" con nome "Ivy Taylor", reparto "Marketing", stipendio 62000, esperienza 5, e l'ID del dipendente da cercare è "S003", il tuo programma dovrebbe produrre:

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

Il tuo programma deve creare una struttura Map annidata in cui la mappa esterna usa gli ID dei dipendenti come chiavi e ogni valore è una mappa interna contenente "name", "department", "salary" e "experience" come chiavi. Usa l'accesso alle mappe annidate con doppie parentesi quadre per recuperare informazioni specifiche sui dipendenti. Conta i dipendenti per reparto e calcola lo stipendio medio dividendo la somma totale degli stipendi per il numero di dipendenti. Il formato di input sarà: nome dell'azienda, poi gruppi di cinque valori (ID dipendente, nome, reparto, stipendio, esperienza) che terminano con "employees_done", seguiti dall'ID del dipendente da cercare.

Provalo tu

import 'dart:io';

void main() {
  // Leggi il nome dell'azienda
  String? companyName = stdin.readLineSync();
  
  // Inizializza una mappa annidata per la directory dei dipendenti
  Map<String, Map<String, dynamic>> employeeDirectory = {};
  
  // Leggi i dati dei dipendenti fino a "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();
    
    // Converti lo stipendio e gli anni di esperienza in numeri interi
    int salary = int.parse(salaryStr!);
    int experience = int.parse(experienceStr!);
    
    // TODO: Crea una struttura a mappe annidate per ogni dipendente e aggiungila alla directory
    
  }
  
  // Leggi l'ID del dipendente da cercare
  String? lookupId = stdin.readLineSync();
  
  // TODO: Scrivi il codice qui sotto per:
  // 1. Visualizzare il nome dell'azienda e la directory dei dipendenti
  // 2. Cercare e visualizzare le informazioni di un dipendente specifico
  // 3. Calcolare le statistiche dei reparti
  // 4. Calcolare lo stipendio medio
  // 5. Stampare il report completo nel formato richiesto
  
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Dart online