Les Maps

17-Java SE Les maps en Java

Les maps en Java sont des structures de données qui permettent d’associer des clés à des valeurs, offrant ainsi une manière efficace de stocker et récupérer des données basées sur une relation clé-valeur. Dans cet article, nous explorerons les différentes implémentations de maps disponibles dans la bibliothèque standard de Java et comment les utiliser pour résoudre divers problèmes de manipulation de données.

accès rapide

La démo

mettre la vidéo ici

Introduction aux Maps en Java

Les maps en Java sont des structures de données qui permettent d’associer des clés à des valeurs, offrant ainsi une manière efficace de stocker et récupérer des données basées sur une relation clé-valeur. Dans cet article, nous explorerons les différentes implémentations de maps disponibles dans la bibliothèque standard de Java et comment les utiliser pour résoudre divers problèmes de manipulation de données.

Qu’est-ce qu’une Map en Java ?

Une map est une structure de données qui associe des clés uniques à des valeurs. Chaque clé est associée à une seule valeur, et l’accès aux valeurs se fait en utilisant les clés correspondantes. Java propose plusieurs implémentations de maps, notamment HashMap, TreeMap, et LinkedHashMap, chacune offrant des fonctionnalités spécifiques pour différents cas d’utilisation.

Les Interfaces Map en Java

L’interface Map définit le cadre pour toutes les implémentations de maps en Java. Les maps offrent des méthodes pour mettre en correspondance, ajouter, supprimer et récupérer des éléments en fonction de clés. D’autres interfaces telles que HashMap, TreeMap, et LinkedHashMap étendent cette interface pour fournir des fonctionnalités spécifiques.

// Exemple d'utilisation de l'interface Map
Map<String, Integer> maMap = new HashMap<>();

Utilisation de HashMap

HashMap est l’une des implémentations les plus couramment utilisées de l’interface Map en Java. Elle stocke les paires clé-valeur dans une table de hachage, permettant un accès rapide aux données.

Création d’une HashMap

Pour créer une instance de HashMap en Java, vous pouvez utiliser le constructeur par défaut :

Map<String, Integer> scores = new HashMap<>();

Cette ligne de code crée une nouvelle HashMap où les clés sont de type String et les valeurs sont de type Integer.

Ajout et Accès aux Éléments

Vous pouvez ajouter des éléments à la HashMap à l’aide de la méthode put() :

scores.put("Alice", 95);
scores.put("Bob", 85);
scores.put("Charlie", 90);

Pour accéder à la valeur associée à une clé spécifique, vous pouvez utiliser la méthode get() :

int scoreAlice = scores.get("Alice");
System.out.println("Score d'Alice : " + scoreAlice);

Parcours des Éléments

Pour parcourir tous les éléments d’une HashMap, vous pouvez utiliser une boucle foreach sur les entrées de la Map :

for (Map.Entry<String, Integer> entry : scores.entrySet()) {
    System.out.println(entry.getKey() + " : " + entry.getValue());
}

La HashMap offre des performances élevées pour les opérations d’ajout, de suppression et de recherche. Cependant, elle ne garantit pas l’ordre des éléments.

Suppression d’Éléments d’une HashMap

Pour supprimer un élément de la HashMap, utilisez la méthode remove() en spécifiant la clé :

hashMap.remove("Alice");

La HashMap offre un accès rapide aux éléments et est idéale pour de nombreuses applications.

Utilisation de TreeMap

La classe TreeMap, une implémentation de l’interface Map en Java, maintient les éléments triés selon l’ordre naturel des clés ou un ordre spécifié par un comparateur. Voici comment l’utiliser :

Création d’un TreeMap

Pour créer une instance de TreeMap, vous pouvez utiliser le constructeur par défaut :

Map<String, Integer> treeMap = new TreeMap<>();

Ajout d’Éléments à un TreeMap

Pour ajouter un élément à un TreeMap, utilisez la méthode put() en spécifiant à la fois la clé et la valeur :

treeMap.put("clé", valeur);

Exemple :

treeMap.put("Alice", 25);
treeMap.put("Bob", 30);

Accès aux Éléments d’un TreeMap

Pour accéder à un élément d’un TreeMap, utilisez la méthode get() en spécifiant la clé :

Integer age = treeMap.get("Alice");

Suppression d’Éléments d’un TreeMap

Pour supprimer un élément d’un TreeMap, utilisez la méthode remove() en spécifiant la clé :

treeMap.remove("Alice");

Le TreeMap maintient les éléments dans un ordre trié, ce qui peut être utile dans de nombreuses situations.

Utilisation de LinkedHashMap

La classe LinkedHashMap est une autre implémentation de l’interface Map en Java. Elle combine les fonctionnalités de HashMap avec un ordre de parcours prévisible basé sur l’ordre d’insertion. Voici comment l’utiliser :

Création d’un LinkedHashMap

Pour créer une instance de LinkedHashMap, vous pouvez utiliser le constructeur par défaut :

Map<String, Integer> linkedHashMap = new LinkedHashMap<>();

Ajout d’Éléments à un LinkedHashMap

Pour ajouter un élément à un LinkedHashMap, utilisez la méthode put() en spécifiant à la fois la clé et la valeur :

linkedHashMap.put("clé", valeur);

Exemple :

linkedHashMap.put("Alice", 25);
linkedHashMap.put("Bob", 30);

Accès aux Éléments d’un LinkedHashMap

Pour accéder à un élément d’un LinkedHashMap, utilisez la méthode get() en spécifiant la clé :

Integer age = linkedHashMap.get("Alice");

Suppression d’Éléments d’un LinkedHashMap

Pour supprimer un élément d’un LinkedHashMap, utilisez la méthode remove() en spécifiant la clé :

linkedHashMap.remove("Alice");

Le LinkedHashMap conserve l’ordre d’insertion des éléments, ce qui peut être utile dans certaines situations où l’ordre des éléments est important.

Différences entre HashMap, TreeMap et LinkedHashMap

1. Utilisation de HashMap :

HashMap est une implémentation de base de l’interface Map. Elle utilise le principe du hachage pour stocker les paires clé-valeur.

// Création d'une HashMap
Map<String, Integer> hashMap = new HashMap<>();

// Ajout d'éléments
hashMap.put("Java", 1);
hashMap.put("Python", 2);
hashMap.put("C++", 3);

// Affichage des éléments
System.out.println("HashMap : " + hashMap);
Explication du Code :
// Création d'une HashMap
Map<String, Integer> hashMap = new HashMap<>();

Explication : Dans cette ligne, une nouvelle instance de la classe HashMap est créée. La HashMap est paramétrée pour stocker des paires clé-valeur, où les clés sont de type String et les valeurs sont de type Integer. La variable hashMap est désormais une référence vers cette nouvelle HashMap vide.

// Ajout d'éléments
hashMap.put("Java", 1);
hashMap.put("Python", 2);
hashMap.put("C++", 3);

Explication : Ces lignes ajoutent des paires clé-valeur à la HashMap. Chaque put ajoute une nouvelle entrée, où la clé est la première valeur entre parenthèses, et la valeur est la deuxième valeur. Dans cet exemple, « Java » est associé à 1, « Python » à 2, et « C++ » à 3.

// Affichage des éléments
System.out.println("HashMap : " + hashMap);

Explication : Cette ligne affiche le contenu de la HashMap. La méthode toString() de la HashMap est implicitement appelée lors de la concaténation avec la chaîne de caractères « HashMap : « . Cela affiche toutes les paires clé-valeur actuellement présentes dans la HashMap.

Résultat d’affichage :
HashMap : {Java=1, Python=2, C++=3}

Explication du Résultat : La HashMap contient maintenant trois paires clé-valeur : « Java » associé à 1, « Python » associé à 2, et « C++ » associé à 3. L’ordre d’affichage peut varier car HashMap ne garantit pas un ordre spécifique.


2. Utilisation de TreeMap :

TreeMap maintient les clés triées dans l’ordre naturel ou selon un comparateur fourni.

// Création d'une TreeMap
Map<String, Integer> treeMap = new TreeMap<>();

// Ajout d'éléments
treeMap.put("Java", 1);
treeMap.put("Python", 2);
treeMap.put("C++", 3);

// Affichage des éléments
System.out.println("TreeMap : " + treeMap);
Explication du Code
// Création d'une TreeMap
Map<String, Integer> treeMap = new TreeMap<>();

Explication : Dans cette ligne, une nouvelle instance de la classe TreeMap est créée. Tout comme la HashMap, la TreeMap est paramétrée pour stocker des paires clé-valeur, où les clés sont de type String et les valeurs sont de type Integer. La variable treeMap est désormais une référence vers cette nouvelle TreeMap vide.

// Ajout d'éléments
treeMap.put("Java", 1);
treeMap.put("Python", 2);
treeMap.put("C++", 3);

Explication : Ces lignes ajoutent des paires clé-valeur à la TreeMap. Chaque put ajoute une nouvelle entrée, où la clé est la première valeur entre parenthèses, et la valeur est la deuxième valeur. Dans cet exemple, « Java » est associé à 1, « Python » à 2, et « C++ » à 3.

// Affichage des éléments
System.out.println("TreeMap : " + treeMap);

Explication : Cette ligne affiche le contenu de la TreeMap. La méthode toString() de la TreeMap est implicitement appelée lors de la concaténation avec la chaîne de caractères « TreeMap : « . Cela affiche toutes les paires clé-valeur actuellement présentes dans la TreeMap.

Résultat d’affichage :
TreeMap : {C++=3, Java=1, Python=2}

Explication du Résultat : Contrairement à la HashMap, la TreeMap affiche les éléments dans l’ordre naturel des clés (ordre lexicographique pour les chaînes). Ainsi, les éléments sont triés alphabétiquement ici : « C++ » associé à 3, « Java » associé à 1, et « Python » associé à 2.


3. Utilisation de LinkedHashMap :

LinkedHashMap conserve l’ordre d’insertion des éléments.

// Création d'une LinkedHashMap
Map<String, Integer> linkedHashMap = new LinkedHashMap<>();

// Ajout d'éléments
linkedHashMap.put("Java", 1);
linkedHashMap.put("Python", 2);
linkedHashMap.put("C++", 3);

// Affichage des éléments
System.out.println("LinkedHashMap : " + linkedHashMap);
Explication du Code
// Création d'une LinkedHashMap
Map<String, Integer> linkedHashMap = new LinkedHashMap<>();

Explication : Dans cette ligne, une nouvelle instance de la classe LinkedHashMap est créée. La LinkedHashMap est paramétrée pour stocker des paires clé-valeur, tout comme la HashMap et la TreeMap. La variable linkedHashMap est désormais une référence vers cette nouvelle LinkedHashMap vide.

// Ajout d'éléments
linkedHashMap.put("Java", 1);
linkedHashMap.put("Python", 2);
linkedHashMap.put("C++", 3);

Explication : Ces lignes ajoutent des paires clé-valeur à la LinkedHashMap. Comme pour les autres implémentations de Map, chaque put ajoute une nouvelle entrée, où la clé est la première valeur entre parenthèses, et la valeur est la deuxième valeur. Dans cet exemple, « Java » est associé à 1, « Python » à 2, et « C++ » à 3.

// Affichage des éléments
System.out.println("LinkedHashMap : " + linkedHashMap);

Explication : Cette ligne affiche le contenu de la LinkedHashMap. La méthode toString() de la LinkedHashMap est implicitement appelée lors de la concaténation avec la chaîne de caractères « LinkedHashMap : « . Cela affiche toutes les paires clé-valeur actuellement présentes dans la LinkedHashMap.

Résultat d’affichage :
LinkedHashMap : {Java=1, Python=2, C++=3}

Explication du Résultat : À l’instar de la HashMap, l’ordre d’insertion est préservé dans la LinkedHashMap. Ainsi, les éléments sont affichés dans l’ordre dans lequel ils ont été ajoutés : « Java » associé à 1, « Python » associé à 2, et « C++ » associé à 3.


Tableau Récapitulatif : HashMap vs TreeMap vs LinkedHashMap

CritèreHashMapTreeMapLinkedHashMap
Ordre d’AffichageAucun ordre spécifiqueTrié par ordre naturel des clésOrdre d’insertion préservé
Gestion des CollisionsListe chaînée dans les seauxStructure d’arbre (Red-Black)Liste chaînée dans l’ordre d’insertion
Exemple d’ApplicationGestion de clés-valeurs sans ordre particulierDictionnaire triéGestion de configurations avec ordre spécifique d’ajout
Tableau Récapitulatif : HashMap vs TreeMap vs LinkedHashMap

Explications :

  • Ordre d’Affichage : L’ordre dans lequel les éléments sont affichés dépend de l’implémentation. HashMap n’a pas d’ordre spécifique, TreeMap est trié par ordre naturel des clés, et LinkedHashMap préserve l’ordre d’insertion.
  • Gestion des Collisions : En cas de collisions (deux clés ayant le même index), HashMap utilise une liste chaînée, TreeMap utilise une structure d’arbre (Red-Black), et LinkedHashMap utilise une liste chaînée dans l’ordre d’insertion.
  • Exemple d’Application : Donne des exemples d’applications où chaque implémentation peut être préférée en fonction des caractéristiques spécifiques qu’elle offre.

Opérations Courantes sur les Maps

Les Maps en Java offrent un large éventail d’opérations pour manipuler les données qu’elles contiennent. Voici quelques-unes des opérations couramment utilisées :

Vérification de l’Existence d’une Clé

Pour vérifier si une clé existe dans une Map, utilisez la méthode containsKey() :

if (map.containsKey("clé")) {
    // La clé existe dans la map
} else {
    // La clé n'existe pas dans la map
}

Vérification de l’Existence d’une Valeur

Pour vérifier si une valeur existe dans une Map, utilisez la méthode containsValue() :

if (map.containsValue(valeur)) {
    // La valeur existe dans la map
} else {
    // La valeur n'existe pas dans la map
}

Récupération de la Taille de la Map

Pour obtenir le nombre d’éléments dans une Map, utilisez la méthode size() :

int taille = map.size();

Parcours des Clés et des Valeurs

Pour parcourir toutes les clés d’une Map, utilisez la méthode keySet() combinée à une boucle :

for (Clé clé : map.keySet()) {
    // Utilisation de la clé
}

Pour parcourir toutes les valeurs d’une Map, utilisez la méthode values() combinée à une boucle :

for (Valeur valeur : map.values()) {
    // Utilisation de la valeur
}

Parcours des Paires Clé-Valeur

Pour parcourir toutes les paires clé-valeur d’une Map, utilisez la méthode entrySet() combinée à une boucle :

for (Map.Entry<Clé, Valeur> entry : map.entrySet()) {
    Clé clé = entry.getKey();
    Valeur valeur = entry.getValue();
    // Utilisation de la clé et de la valeur
}

Ces opérations vous permettent de manipuler efficacement les données dans une Map en Java et de réaliser une grande variété de tâches.

Bonnes Pratiques et Astuces

Lors de l’utilisation des Maps en Java, il est important de suivre quelques bonnes pratiques pour garantir un code efficace et maintenable. Voici quelques astuces et bonnes pratiques à prendre en compte :

Utilisation de Types Génériques

Utilisez des types génériques pour spécifier les types de clé et de valeur dans votre Map. Cela garantit la sécurité des types et facilite la détection des erreurs de programmation lors de la compilation.

Map<String, Integer> map = new HashMap<>();

Manipulation Sécurisée des Clés et des Valeurs

Assurez-vous de manipuler les clés et les valeurs de manière sécurisée pour éviter les erreurs de runtime. Utilisez des méthodes telles que containsKey() et containsValue() pour vérifier l’existence d’une clé ou d’une valeur avant de les manipuler.

if (map.containsKey("clé")) {
    Integer valeur = map.get("clé");
}

Utilisation de l’Interface Map

Lors de la déclaration de variables, utilisez l’interface Map plutôt que des implémentations spécifiques telles que HashMap ou TreeMap. Cela permet une plus grande flexibilité lors de la modification de l’implémentation sous-jacente à l’avenir.

Map<String, Integer> map = new HashMap<>();

Utilisation des Implémentations Spécifiques

Choisissez l’implémentation de Map la mieux adaptée à votre cas d’utilisation. Par exemple, utilisez HashMap pour un accès rapide aux éléments ou TreeMap pour un ordre de tri spécifique.

Map<String, Integer> hashMap = new HashMap<>();
Map<String, Integer> treeMap = new TreeMap<>();

Utilisation de la Méthode putIfAbsent()

La méthode putIfAbsent() peut être utilisée pour ajouter une paire clé-valeur à une Map si la clé spécifiée n’existe pas déjà dans la Map.

map.putIfAbsent("clé", valeur);

En suivant ces bonnes pratiques et astuces, vous pouvez maximiser l’efficacité et la maintenabilité de votre code lors de l’utilisation des Maps en Java.

Exercices Pratiques

Pour renforcer votre compréhension des Maps en Java, voici quelques exercices pratiques que vous pouvez réaliser :

Exercice 1 : Création d’une Map et Ajout d’Éléments :

Créez une Map pour stocker les noms et les âges des personnes, puis ajoutez quelques paires clé-valeur à la Map.

Correction

import java.util.*;

public class Exercice1 {
    public static void main(String[] args) {
        Map<String, Integer> personnes = new HashMap<>();
        personnes.put("Alice", 25);
        personnes.put("Bob", 30);
        personnes.put("Charlie", 40);
        
        System.out.println("Map créée et éléments ajoutés avec succès !");
    }
}

Exercice 2 : Accès aux Éléments d’une Map :

Accédez aux éléments de la Map créée précédemment en utilisant les clés et affichez les valeurs correspondantes.

Correction

import java.util.*;

public class Exercice2 {
    public static void main(String[] args) {
        Map<String, Integer> personnes = new HashMap<>();
        personnes.put("Alice", 25);
        personnes.put("Bob", 30);
        personnes.put("Charlie", 40);
        
        Integer ageAlice = personnes.get("Alice");
        Integer ageBob = personnes.get("Bob");
        
        System.out.println("Âge d'Alice : " + ageAlice);
        System.out.println("Âge de Bob : " + ageBob);
    }
}

Exercice 3 : Suppression d’Éléments d’une Map :

Supprimez un élément de la Map en utilisant sa clé, puis affichez la Map mise à jour.

Correction

import java.util.*;

public class Exercice3 {
    public static void main(String[] args) {
        Map<String, Integer> personnes = new HashMap<>();
        personnes.put("Alice", 25);
        personnes.put("Bob", 30);
        personnes.put("Charlie", 40);
        
        personnes.remove("Charlie");
        
        System.out.println("Élément 'Charlie' supprimé avec succès !");
    }
}

Exercice 4 : Vérification de l’Existence d’une Clé dans une Map :

Vérifiez si une clé spécifique existe dans la Map et affichez un message approprié en conséquence.

Correction

import java.util.*;

public class Exercice4 {
    public static void main(String[] args) {
        Map<String, Integer> personnes = new HashMap<>();
        personnes.put("Alice", 25);
        personnes.put("Bob", 30);
        personnes.put("Charlie", 40);
        
        if (personnes.containsKey("Alice")) {
            System.out.println("La clé 'Alice' existe dans la Map.");
        } else {
            System.out.println("La clé 'Alice' n'existe pas dans la Map.");
        }
    }
}

Exercice 5 : Parcours des Paires Clé-Valeur :

Parcourez toutes les paires clé-valeur de la Map et affichez chaque clé et sa valeur correspondante.

Correction

import java.util.*;

public class Exercice5 {
    public static void main(String[] args) {
        Map<String, Integer> personnes = new HashMap<>();
        personnes.put("Alice", 25);
        personnes.put("Bob", 30);
        personnes.put("Charlie", 40);
        
        for (Map.Entry<String, Integer> entry : personnes.entrySet()) {
            String nom = entry.getKey();
            Integer age = entry.getValue();
            System.out.println("Nom : " + nom + ", Âge : " + age);
        }
    }
}

Exercice 6 : Combinaison de Maps :

Écrivez une méthode qui prend deux Maps contenant des informations sur des personnes (par exemple, une Map contenant les noms et les âges, et une autre Map contenant les noms et les adresses) et combine ces informations en une seule Map contenant les noms comme clés et un objet contenant les informations complètes (âge et adresse) comme valeur.

Correction

import java.util.*;

public class Main {
    public static void main(String[] args) {
        // Exemple de données: Maps contenant des informations sur les âges et les adresses des personnes
        Map<String, Integer> mapAges = new HashMap<>();
        mapAges.put("Alice", 25);
        mapAges.put("Bob", 30);
        mapAges.put("Charlie", 40);

        Map<String, String> mapAdresses = new HashMap<>();
        mapAdresses.put("Alice", "123 rue Principale");
        mapAdresses.put("Bob", "456 avenue Secondaire");

        // Appel de la méthode pour combiner les Maps
        Map<String, Personne> mapResultat = combinerMaps(mapAges, mapAdresses);

        // Affichage du résultat
        for (Map.Entry<String, Personne> entry : mapResultat.entrySet()) {
            String nom = entry.getKey();
            Personne personne = entry.getValue();
            System.out.println("Nom: " + nom + ", Age: " + personne.getAge() + ", Adresse: " + personne.getAdresse());
        }
    }

    // Méthode pour combiner les Maps d'âges et d'adresses en une seule Map de Personnes
    public static Map<String, Personne> combinerMaps(Map<String, Integer> mapAges, Map<String, String> mapAdresses) {
        Map<String, Personne> mapResultat = new HashMap<>();
        for (Map.Entry<String, Integer> entry : mapAges.entrySet()) {
            String nom = entry.getKey();
            Integer age = entry.getValue();
            String adresse = mapAdresses.getOrDefault(nom, "Adresse inconnue");
            Personne personne = new Personne(age, adresse);
            mapResultat.put(nom, personne);
        }
        return mapResultat;
    }
}

// Classe Personne pour représenter les informations d'une personne
class Personne {
    private int age;
    private String adresse;

    public Personne(int age, String adresse) {
        this.age = age;
        this.adresse = adresse;
    }

    public int getAge() {
        return age;
    }

    public String getAdresse() {
        return adresse;
    }
}

Conclusion

Les Maps en Java sont des structures de données puissantes et polyvalentes qui permettent de stocker et de manipuler des associations de clés-valeurs. Dans ce tutoriel, nous avons exploré différentes implémentations de l’interface Map, telles que HashMap, TreeMap et LinkedHashMap, ainsi que leurs caractéristiques et leurs cas d’utilisation spécifiques.

Nous avons appris comment créer, ajouter, accéder, mettre à jour et supprimer des éléments d’une Map, ainsi que diverses opérations courantes telles que la vérification de l’existence d’une clé ou d’une valeur, le parcours des clés, des valeurs et des paires clé-valeur, et l’utilisation de méthodes spécifiques telles que putIfAbsent().

De plus, nous avons abordé des bonnes pratiques et des astuces pour utiliser efficacement les Maps en Java, telles que l’utilisation de types génériques, la manipulation sécurisée des clés et des valeurs, et le choix de l’implémentation appropriée en fonction des exigences spécifiques de votre application.

Enfin, nous avons proposé des exercices pratiques pour renforcer vos compétences dans l’utilisation des Maps, ainsi qu’une série de problèmes plus avancés pour vous défier davantage et approfondir votre compréhension.

En intégrant les concepts et les techniques présentés dans ce tutoriel dans votre propre code, vous serez mieux équipé pour gérer efficacement les données associatives dans vos projets Java.

Quiz du tuto

Vous pouvez tester que vous avez bien assimiler tous ce que nous avons appris ensemble via ce quiz 🙂 🙂 amusez vous bien.

/10
0 votes, 0 avg
3
Créé le

Quiz JAVA SE : Les Maps en Java

Ce quiz vous aide à améliorer vos connaissances en Java SE 🙂 🙂 

1 / 10

1. Quelle méthode est utilisée pour parcourir toutes les valeurs d'une Map ?

2 / 10

2. Quelle méthode est utilisée pour accéder à la valeur associée à une clé dans une Map ?

3 / 10

3. Quelle méthode est utilisée pour vérifier si une clé existe dans une Map ?

4 / 10

4. Quelle méthode est utilisée pour parcourir toutes les clés d'une Map ?

5 / 10

5. Quelle méthode est utilisée pour ajouter un élément à une Map ?

6 / 10

6. Quelle méthode est utilisée pour parcourir toutes les paires clé-valeur d'une Map ?

7 / 10

7. Quelle implémentation de l'interface Map garantit un ordre de parcours prévisible basé sur l'ordre d'insertion ?

8 / 10

8. Quelle méthode est utilisée pour supprimer un élément d'une Map en spécifiant sa clé ?

9 / 10

9. Quelle interface représente une structure de données associant des clés à des valeurs uniques ?

10 / 10

10. Quelle méthode est utilisée pour obtenir le nombre d'éléments dans une Map ?

Votre note est de

0%

Veuillez évaluer ce quiz

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *