Techniques de Parcours des Collections Map en Java

1. Itération via le Set de Clés (keySet)

Cette méthode consiste à récupérer l'ensemble des clés contenues dans la carte, puis à invoquer la méthode get() pour récupérer la valeur associée à chaque clé lors du cycle.

import java.util.HashMap;
import java.util.Map;

public class KeySetExample {
    public static void main(String[] args) {
        Map<string integer=""> stockProduits = new HashMap<>();
        stockProduits.put("Pomme", 10);
        stockProduits.put("Poire", 15);
        stockProduits.put("Cerise", 25);

        for (String cle : stockProduits.keySet()) {
            Integer quantite = stockProduits.get(cle);
            System.out.println("Article : " + cle + ", Quantité : " + quantite);
        }
    }
}</string>
  • Avantage : La syntaxe est familière pour ceux qui débutent.
  • Inconvénient : Chaque appel à get() déclenche une nouvelle recherche de hachage au sein du tableau interne, ce qui peut impacter la vitesse globale si la collection est volumineuse.

2. Utilisation de l'Entrée de Données (entrySet)

C'est souvent la stratégie privilégiée car elle permet d'accéder directement aux objets Map.Entry, contenant simultanément la clé et la valeur sans requêtes supplémentaires.

import java.util.HashMap;
import java.util.Map;

public class EntrySetExample {
    public static void main(String[] args) {
        Map<integer string=""> idClient = new HashMap<>();
        idClient.put(101, "Alice");
        idClient.put(102, "Bob");
        idClient.put(103, "Charlie");

        for (Map.Entry<integer string=""> pair : idClient.entrySet()) {
            System.out.println("ID : " + pair.getKey() + " -> Nom : " + pair.getValue());
        }
    }
}</integer></integer>
  • Avantage : Optimisation de l'accès mémoire ; une seule opération de hachage est requise par entrée.
  • Inconvénient : Nécessite l'utilisation du type générique Map.Entry.

3. Manipulation Explicite avec Iterator

L'itérateur offre un contrôle plus granulaire, notamment permettant de supprimer des éléments durant le bouclage sans provoquer d'exception ConcurrentModificationException.

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class IteratorExample {
    public static void main(String[] args) {
        Map<string boolean=""> status = new HashMap<>();
        status.put("online", true);
        status.put("offline", false);

        Iterator<map.entry boolean="">> iter = status.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry<string boolean=""> element = iter.next();
            if (element.getValue() == false) {
                iter.remove(); 
            }
        }
    }
}</string></map.entry></string>
  • Avantage : Suppression sécurisée des entrées pendant la lecture.
  • Inconvénient : Syntaxe verbosa, moins fluide que le forEach moderne.

4. Fonctions Lambda et Méthodes de Référence (Java 8+)

Avec l'avènement de Java 8, la classe Map inclut une méthode native forEach acceptant une fonctionnelle bi-argumentaire.

import java.util.HashMap;
import java.util.Map;

public class LambdaExample {
    public static void main(String[] args) {
        Map<string double=""> prix = new HashMap<>();
        prix.put("Livre", 19.99);
        prix.put("Clavier", 59.90);

        prix.forEach((nomArticle, montant) -> {
            System.out.printf("Produit : %s | Tarif : %.2f€%n", nomArticle, montant);
        });
    }
}</string>
  • Avantage : Concision maximale et lisibilité accrue pour les transformations simples.
  • Inconvénient : Impossible de retirer des éléments directement sans utiliser l'itérateur sous-jacent ou des flux.

Analyse Comparative des Performances

Le choix de la technique influence les ressources consommées :

  1. EntrySet reste généralement optimal pour la lecture intensive, évitant les collisions redondantes de hachage.
  2. KeySet + get induit une surcharge non négligeable sur de grands jeux de données.
  3. Iterator et forEach offrent des performances comparables à entrySet, mais avec des objectifs d'usage différents (modification vs lecture pure).

Notez que pour des structures petites (< 100 éléments), la différence de temps d'exécution est imperceptible devant la qualité du code source.

Fondamentaux des Structures de Données

Pour contextualiser ces méthodes, il est essentiel de comprendre la nature de la Map (Carte).

Une Map est une interface représentant un ensemble de mappages uniques. Contrairement à une List, l'index n'est pas numérique, mais une clé unique. Elle assure que :

  • Chaque clé n'aparaît qu'une seule fois.
  • L'ordre n'est pas garanti par défaut (sauf avec LinkedHashMap ou TreeMap).
  • L'introduction de null comme clé ou valeur est possible selon l'implémentation spécifique.

Le concept de Traversal (ou parcours) désigne le processus systématique visitant chaque item d'une structure sans omission ni répétition. C'est la base des opérations de filtrage, tarnsformation ou agrégation de données.

Exemple Complet Intégré

Voici une classe montrant les opérations CRUD (Create, Read, Update, Delete) couplées au parcours :

import java.util.HashMap;
import java.util.Map;

public class CompleteMapDemo {
    public static void main(String[] args) {
        // Initialisation
        Map<long string=""> employés = new HashMap<>();
        
        // Création
        employés.put(1L, "Jean Dupont");
        employés.put(2L, "Marie Curie");
        employés.put(3L, "Louis Pasteur");

        // Lecture via forEach
        System.out.println("--- Liste des Employés ---");
        employés.forEach((id, nom) -> System.out.println(id + " : " + nom));

        // Modification indirecte
        Map.Entry<long string=""> entryToModify = null;
        for (Map.Entry<long string=""> e : employés.entrySet()) {
            if (e.getKey().equals(2L)) {
                entryToModify = e;
                break;
            }
        }
        if (entryToModify != null) {
             // En Java, entry.setValue modifie la map originale
             entryToModify.setValue("Marie Curie - Chef de Equipe"); 
        }

        // Suppression
        employés.remove(3L);
        System.out.println("Après suppression : " + employés.size() + " lignes restantes.");
    }
}</long></long></long>

Étiquettes: Java map-collections keyset entryset Lambda-Expressions

Publié le 27 octobre à 00h52