Menu
CoddyTech

Maps imbriquées

Fait partie de la section Logique & Flux du Journey Dart de Coddy. Leçon 31 sur 65.

Parfois, tu dois organiser les données dans une structure hiérarchique plus complexe qu’une simple paire clé-valeur. Les maps imbriquées te permettent de stocker des maps comme valeurs dans d’autres maps, créant ainsi plusieurs niveaux d’organisation des données.

Une map imbriquée est simplement une Map dont les valeurs sont elles-mêmes des objets Map. Cette structure est idéale pour représenter des données comportant des catégories et des sous-catégories, comme des profils utilisateur avec plusieurs 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']);      // 32

Pour accéder aux données d’une map imbriquée, tu utilises plusieurs crochets. La première paire accède à la clé de la map externe, et la deuxième à la clé de la map interne. Une recherche dans une map renvoie null lorsque la clé est introuvable ; Dart a donc besoin d’un ! après la première recherche lorsque tu sais que la clé existe : userProfiles['alice']!['email']. Cette structure à deux niveaux facilite le regroupement des informations associées tout en les gardant organisées et accessibles.

challenge icon

Défi

Facile

Crée un programme qui gère le système d’annuaire des employés d’une entreprise à l’aide de maps imbriquées pour stocker des informations détaillées sur les employés. Ton programme doit :

  1. Lire une chaîne de caractères représentant le nom de l’entreprise
  2. Lire plusieurs ensembles de données représentant les informations des employés (la saisie prendra fin lorsque tu recevras "employees_done"). Chaque employé aura :
    • Un identifiant d’employé (chaîne de caractères)
    • Un nom (chaîne de caractères)
    • Un service (chaîne de caractères)
    • Un salaire (chaîne de caractères à convertir en entier)
    • Des années d’expérience (chaîne de caractères à convertir en entier)
  3. Lire une chaîne de caractères représentant l’identifiant de l’employé à rechercher
  4. Créer une Map imbriquée dans laquelle chaque identifiant d’employé est une clé et la valeur est une autre Map contenant les détails de l’employé
  5. Accéder aux informations d’un employé en particulier à l’aide d’un accès à une map imbriquée et les afficher
  6. Calculer les statistiques par service et afficher le rapport de l’annuaire des employés dans le format exact indiqué ci-dessous

Par exemple, si le nom de l’entreprise est "TechCorp Solutions", que les données des employés comprennent "EMP001" avec le nom "Alice Johnson", le service "Engineering", le salaire 75000, l’expérience 5, "EMP002" avec le nom "Bob Smith", le service "Marketing", le salaire 60000, l’expérience 3, "EMP003" avec le nom "Carol Davis", le service "Engineering", le salaire 80000, l’expérience 7, et que l’identifiant de l’employé à rechercher est "EMP001", ton 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 successfully

Si le nom de l’entreprise est "Global Industries", que les données des employés comprennent "E100" avec le nom "David Wilson", le service "Sales", le salaire 55000, l’expérience 4, "E101" avec le nom "Emma Brown", le service "HR", le salaire 65000, l’expérience 6, et que l’identifiant de l’employé à rechercher est "E101", ton 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 successfully

Si le nom de l’entreprise est "StartupHub", que les données des employés comprennent "S001" avec le nom "Frank Miller", le service "Development", le salaire 70000, l’expérience 2, "S002" avec le nom "Grace Lee", le service "Design", le salaire 58000, l’expérience 3, "S003" avec le nom "Henry Chen", le service "Development", le salaire 72000, l’expérience 4, "S004" avec le nom "Ivy Taylor", le service "Marketing", le salaire 62000, l’expérience 5, et que l’identifiant de l’employé à rechercher est "S003", ton 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 successfully

Ton programme doit créer une structure de Map imbriquée dans laquelle la map externe utilise les identifiants des employés comme clés, et chaque valeur est une map interne contenant "name", "department", "salary" et "experience" comme clés. Utilise l’accès à une map imbriquée avec des doubles crochets pour récupérer les informations d’un employé en particulier. Compte les employés par service et calcule le salaire moyen en divisant la somme totale des salaires par le nombre d’employés. Le format de saisie sera le suivant : nom de l’entreprise, puis des ensembles de cinq valeurs (identifiant de l’employé, nom, service, salaire, expérience) se terminant par "employees_done", suivis de l’identifiant de l’employé à rechercher.

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 une 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: Écrire 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é précis
  // 3. Calculer les statistiques par département
  // 4. Calculer le salaire moyen
  // 5. Afficher le rapport complet dans le format requis
  
}
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur Dart en ligne