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']); // 32Per 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.
Sfida
FacileCrea 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:
- Leggere una stringa che rappresenta il nome dell'azienda
- 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)
- Leggere una stringa che rappresenta l'ID del dipendente da cercare
- Creare una Map annidata in cui ogni ID dipendente è una chiave e il valore è un'altra Map contenente i dettagli del dipendente
- Accedere e visualizzare informazioni specifiche del dipendente usando l'accesso a mappe annidate
- 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 successfullySe 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 successfullySe 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 successfullyIl 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
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Manipolazione avanzata delle liste
Proprietà delle liste: primo e ultimoStato della lista: isEmpty e isNotEmpInvertire una listaAggiungere a una lista: insertRimozione dalla lista: removeWhereRicerca in una lista: indexOfOrdinare una listaMescolare una listaRiepilogo - Organizzatore di liste4Manipolazione avanzata delle mappe
Iterare su una mappaVerificare chiavi e valoriProprietà delle mappe: chiavi e valoriAggiunta condizionale: putIfAbsentRimuovere elementi da una mappaMappe annidateRiepilogo - Aggiornamento dell'inventario2Operazioni funzionali sulle liste
Trasformare con 'map'Filtrare con 'where'Usare '.toList()'Verificare condizioni con 'any'Condizioni con 'every'Trovare con 'firstWhere'Riepilogo - Filtraggio dei dati3Insiemi
Che cos'è un insieme?Creare un insiemeAggiungere e rimuovere elementi dagli insiemiVerificare la presenza di elementi in un insiemeConvertire una lista in un insiemeUnione di insiemiIntersezione di insiemiDifferenza tra insiemiRiepilogo - Lista degli ospiti uniciEsercitati da solo: Compilatore Dart online