Skip to content

API Map

Rappels sur les Map

Après avoir découvert et manipulé l'API Collection, abordons une autre interface importante : Map, qui d'ailleurs ne fait pas partie de l'API Collection, mais permet de gérer des collections de données. Dans la partie suivante, nous aurons besoin d'afficher les heures de décollage de l'avion dans le fuseau horaire de l'aéroport. Pour préparer le terrain, nous allons faire correspondre chaque aéroport avec son fuseau horaire associé. Nous utiliserons une collection de type clé / valeur : les Map.

Les implémentations de Map

En Java, l'interface Map a plusieurs implémentations, chacune ayant des caractéristiques et des utilisations spécifiques. Voici les plus courantes :

  • HashMap : Accès rapide, ordre non garanti.
  • LinkedHashMap : Accès rapide, ordre d'insertion conservé.
  • TreeMap : Clés ordonnées selon un critère de tri.

Exemple d'utilisation

Map<Integer, String> ages = new HashMap<>();
Map<Long, Double> linkedAges = new LinkedHashMap<>();
Map<String, Float> sortedAges = new TreeMap<>();
Pourquoi utilise-t-on les classes wrapper ?

Il est possible d'utiliser des types primitifs (comme int, float, char), mais ils sont automatiquement encapsulés dans leurs classes wrapper correspondantes (Integer, Float, Character, etc.) grâce à l'autoboxing lorsqu'ils sont utilisés dans un Map. On préfère donc directement utiliser les wrappers.

On ajoute un élément(paire clé/valeur) à une Map avec la méthode put:

ages.put("Alice", 30);

On accède à la valeur d'une clé avec get :

Integer aliceAge = ages.get("Alice");

On supprime une clé/valeur avec remove (notez que la valeur est renvoyée en retour) :

Integer aliceAge = ages.remove("Alice");

Création de l'enum Airport

Pour gérer les différents fuseaux horaires, nous commencerons par créer une enum appelée Airport qui representera l'ensemble des aéroports disponibles pour nos voyages.

À vous de jouer

Commencez par déclarer l'énumération Airport avec les valeurs suivantes :

  • PARIS_CHARLES_DE_GAULLE("CDG")
  • PARIS_ORLY("ORY")
  • NEW_YORK_JFK("JFK")
  • NEW_YORK_NEWARK("EWR")
  • NEW_YORK_LAGUARDIA("LGA")
  • TOKYO_NARITA("NRT")
  • TOKYO_HANEDA("HND")

Chaque constante aura un attribut acronym pour stocker son acronyme. N'oubliez pas d'ajouter un constructeur pour initialiser cet attribut, ainsi qu'une méthode getAcronym() pour le récupérer.

Exemple

Cet exemple crée une énumération Color avec trois constantes représentant des couleurs, chacune avec un nom français. Chaque constante possède une méthode pour obtenir son nom français et la méthode toString() est redéfinie pour retourner ce nom lors de l'affichage.

public enum Color {
    RED("Rouge"),
    GREEN("Vert"),
    BLUE("Bleu");

    private final String frenchName;

    Color(String frenchName) {
        this.frenchName = frenchName;
    }

    public String getFrenchName() {
        return frenchName;
    }

    @Override
    public String toString() {
        return frenchName;
    }
}

Maintenant, pour faire correspondre chaque aéroport à son fuseau horaire, nous allons créer une classe AirportManager. Cette classe utilisera une Map pour stocker le fuseau horaire lié à l'aéroport.

À vous de jouer

Créez une classe AirportManager puis déclarez une Map statique timeZone qui associera chaque aéroport à son fuseau horaire.

On pourra utiliser les coefficients suivants :

  • PARIS_CHARLES_DE_GAULLE : Europe/Paris
  • PARIS_ORLY : Europe/Paris
  • NEW_YORK_JFK : America/New_York
  • NEW_YORK_NEWARK : America/New_York
  • NEW_YORK_LAGUARDIA : America/New_York
  • TOKYO_NARITA : Asia/Tokyo
  • TOKYO_HANEDA : Asia/Tokyo
Indice
private static final Map<Color, String> colorToHexMap = new HashMap<>();

static {
    colorToHexMap.put(Color.RED, "#FF0000");
    colorToHexMap.put(Color.GREEN, "#00FF00");
    colorToHexMap.put(Color.BLUE, "#0000FF");
}

Pourquoi utiliser un attribut et une méthode statique ?

L'usage d'éléments statiques dans la classe AirportManager permet d'accéder aux fuseaux horaires des aéroports sans créer une instance de la classe, ce qui est pratique car ces informations sont communes et ne changent pas selon les instances. Cela simplifie l'accès aux données et économise la mémoire.

AirportManager.AirportZoneMap.get(Airport.PARIS_CHARLES_DE_GAULLE);
  • Pensez à changer le type des attributs departure et arrival pour les définir comme étant de type Airport.

Une autre manière de faire pour stocker les fuseaux horaires aurait été de les stocker directement dans l'enum, dans un attribut d'enum (comme cela a été fait pour les acronymes).

Récapitulatif

Dans cette partie, nous avons examiné comment utiliser l'énumération Airport et créer notre Map de fuseaux horaires. Cette dernière sera utilisée ultérieurement pour afficher l'heure de décollage des avions pour chaque voyage dans leur fuseau horaire spécifique.

Check

.
└── utils
│   └── AirportManager.java
└── Main.java`

N'oubliez pas de Commit votre travail !