Maps imbriquées
Fait partie de la section Logique & Flux du Journey Dart de Coddy — leçon 31 sur 65.
Parfois, vous devez organiser les données dans une structure hiérarchique plus complexe qu'une simple paire clé-valeur. Les maps imbriquées vous permettent de stocker des maps en tant que valeurs à l'intérieur d'autres maps, créant ainsi plusieurs niveaux d'organisation des données.
Une map imbriquée est simplement une Map où les valeurs sont elles-mêmes des objets Map. Cette structure est parfaite pour représenter des données qui possèdent des catégories et des sous-catégories, telles que des profils d'utilisateurs avec de multiples détails, ou des catalogues de produits avec divers attributs.
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']); // 32Pour accéder aux données dans une map imbriquée, vous utilisez plusieurs paires de crochets. Le premier ensemble accède à la clé de la map externe, et le second ensemble accède à la clé de la map interne. Cette structure à deux niveaux permet de regrouper facilement les informations liées tout en les gardant organisées et accessibles.
Défi
FacileCréez un programme qui gère le système d'annuaire des employés d'une entreprise en utilisant des maps imbriquées pour stocker des informations détaillées sur les employés. Votre programme doit :
- Lire une chaîne de caractères en entrée représentant le nom de l'entreprise
- Lire plusieurs ensembles d'entrées représentant les données des employés (l'entrée se terminera lorsque vous recevrez
"employees_done"). Chaque employé aura :- ID de l'employé (chaîne de caractères)
- Nom (chaîne de caractères)
- Département (chaîne de caractères)
- Salaire (chaîne de caractères qui doit être convertie en entier)
- Années d'expérience (chaîne de caractères qui doit être convertie en entier)
- Lire une chaîne de caractères en entrée représentant un ID d'employé à rechercher
- Créer une Map imbriquée où chaque ID d'employé est une clé, et la valeur est une autre Map contenant les détails de l'employé
- Accéder et afficher les informations spécifiques d'un employé en utilisant l'accès par map imbriquée
- Calculer les statistiques par département et imprimer le rapport de l'annuaire des employés exactement au format indiqué ci-dessous
Par exemple, si le nom de l'entreprise est "TechCorp Solutions", que les données des employés incluent "EMP001" avec le nom "Alice Johnson", le département "Engineering", le salaire 75000, l'expérience 5, "EMP002" avec le nom "Bob Smith", le département "Marketing", le salaire 60000, l'expérience 3, "EMP003" avec le nom "Carol Davis", le département "Engineering", le salaire 80000, l'expérience 7, et que l'ID de l'employé à rechercher est "EMP001", votre programme doit afficher :
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 le nom de l'entreprise est "Global Industries", que les données des employés incluent "E100" avec le nom "David Wilson", le département "Sales", le salaire 55000, l'expérience 4, "E101" avec le nom "Emma Brown", le département "HR", le salaire 65000, l'expérience 6, et que l'ID de l'employé à rechercher est "E101", votre programme doit afficher :
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 le nom de l'entreprise est "StartupHub", que les données des employés incluent "S001" avec le nom "Frank Miller", le département "Development", le salaire 70000, l'expérience 2, "S002" avec le nom "Grace Lee", le département "Design", le salaire 58000, l'expérience 3, "S003" avec le nom "Henry Chen", le département "Development", le salaire 72000, l'expérience 4, "S004" avec le nom "Ivy Taylor", le département "Marketing", le salaire 62000, l'expérience 5, et que l'ID de l'employé à rechercher est "S003", votre programme doit afficher :
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 successfullyVotre programme doit créer une structure de Map imbriquée où la map externe utilise les IDs des employés comme clés, et chaque valeur est une map interne contenant "name", "department", "salary", et "experience" comme clés. Utilisez l'accès par map imbriquée avec des doubles crochets pour récupérer les informations spécifiques d'un employé. Comptez les employés par département et calculez le salaire moyen en divisant la somme totale des salaires par le nombre d'employés. Le format d'entrée sera : le nom de l'entreprise, puis des ensembles de cinq valeurs (ID de l'employé, nom, département, salaire, expérience) se terminant par "employees_done", suivi de l'ID de l'employé à rechercher.
Aide-mémoire
Les maps imbriquées vous permettent de stocker des maps en tant que valeurs à l'intérieur d'autres maps, créant ainsi des structures de données hiérarchiques :
Map<String, Map<String, dynamic>> userProfiles = {
'alice': {
'email': 'alice@example.com',
'age': 28
},
'bob': {
'email': 'bob@example.com',
'age': 32
}
};Accédez aux données d'une map imbriquée en utilisant plusieurs crochets :
print(userProfiles['alice']['email']); // alice@example.com
print(userProfiles['bob']['age']); // 32Le premier crochet accède à la clé de la map externe, le deuxième crochet accède à la clé de la map interne.
Essayez vous-même
import 'dart:io';
void main() {
// Lire le nom de l'entreprise
String? companyName = stdin.readLineSync();
// Initialiser une map imbriquée pour l'annuaire des employés
Map<String, Map<String, dynamic>> employeeDirectory = {};
// Lire les données des employés jusqu'à "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 le salaire et l'expérience en entiers
int salary = int.parse(salaryStr!);
int experience = int.parse(experienceStr!);
// TODO: Créer la structure de map imbriquée pour chaque employé et l'ajouter à l'annuaire
}
// Lire l'ID de l'employé à rechercher
String? lookupId = stdin.readLineSync();
// TODO: Écrivez votre code ci-dessous pour :
// 1. Afficher le nom de l'entreprise et l'annuaire des employés
// 2. Rechercher et afficher les informations d'un employé spécifique
// 3. Calculer les statistiques par département
// 4. Calculer le salaire moyen
// 5. Imprimer le rapport complet au format requis
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique & Flux
1Manipulation avancée des listes
Propriétés de liste : first & lastÉtat de la liste : isEmpty & isNotEmptyInverser une listeAjouter à une liste : insertSuppression dans une liste : removeWhereRechercher dans une liste : indexOfTrier une listeMélanger une listeRécapitulatif - Organisateur de liste4Manipulation avancée des Maps
Itérer sur une MapVérifier les clés et les valeursPropriétés de Map : keys & valuesAjout conditionnel : putIfAbsentSupprimer des entrées d'une MapMaps imbriquéesRécapitulatif - Mise à jour de l'inventaire2Opérations fonctionnelles sur les listes
Transformer avec 'map'Filtrer avec 'where'Utiliser '.toList()'Vérifier des conditions avec 'any'Conditions avec 'every'Trouver avec 'firstWhere'Récapitulatif - Filtrage de données3Les Ensembles
Qu'est-ce qu'un ensemble ?Créer un ensembleAjouter et supprimer des éléments d'un ensembleVérifier la présence d'éléments dans un ensembleConvertir une liste en ensembleUnion d'ensemblesIntersection d'ensemblesDifférence d'ensemblesRécapitulatif - Liste d'invités uniques