Trier une HashMap par clé en Java

Rashmi Patidar 12 octobre 2023
  1. Trier le jeu de clés à l’aide de la classe TreeMap en Java
  2. Trier le jeu de clés à l’aide des fonctions Java 8
  3. Comprendre la fonction de Stream d’initialisation de carte en Java
  4. Comprendre la fonction Map Transformation Stream en Java
Trier une HashMap par clé en Java

Le terme HashMap en langage Java est la collection dérivée de l’interface Map. Cette collection ou classe est présente dans le package java.util et stocke les données dans une paire clé-valeur. Notez qu’il ne peut pas y avoir deux clés sur la carte. Si la clé en double est insérée, la valeur de la clé respective est remplacée par la valeur la plus récente.

Trier le jeu de clés à l’aide de la classe TreeMap en Java

Ci-dessous se trouve le bloc de code pour démontrer le tri d’une HashMap par sa clé.

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

public class HashMapSortByKey {
  public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();
    map.put("2", "Value5");
    map.put("3", "Value1");
    map.put("1", "Value2");
    map.put("4", "Value3");
    map.put("9", "Value4");
    map.put("hi11", "Value6");
    map.put("hi0", "Value7");
    System.out.print("Unordered List: ");
    for (String s : map.keySet()) {
      System.out.print(" " + s);
    }
    System.out.println();
    System.out.print("Ordered List: ");
    TreeMap<String, String> map1 = new TreeMap<>(map);
    for (String s : map1.keySet()) {
      System.out.print(" " + s);
    }
  }
}

Dans le bloc de code ci-dessus, l’objet map est déclaré en utilisant le constructeur par défaut de HashMap avec le mot-clé new. L’instruction crée une instance de la classe HashSet et attribue la valeur à la référence d’interface map. Les types sont compatibles car la classe HashMap implémente l’interface map en interne.

La carte est initialisée avec un ensemble de valeurs clés. L’insertion se fait à l’aide de la méthode put qui lie la clé à sa valeur spécifiée. La méthode renvoie la previous value si la clé était déjà présente dans la carte et remplace la valeur précédente par une valeur spécifiée. La fonction renvoie une valeur null lorsque la clé n’est pas déjà présente dans la carte. Il lève IllegalArgumentException si la propriété de la clé ou de la valeur interdit l’insertion de la valeur.

Maintenant, pour parcourir la carte, la boucle for-each est utilisée. La fonction map.keySet renvoie le format Set de toutes les touches de la carte. La fonction keyset obtient une collection dans la boucle for-each sur laquelle la variable peut itérer ; par conséquent, l’impression des clés. Il imprimera les valeurs dans un format non ordonné, et il n’y a pas de manière bien définie dont l’utilisateur obtiendra la sortie.

Pour trier les clés de la carte, la classe TreeSet est utilisée. La variable map est donnée en paramètre de constructeur dans le constructeur TreeSet au moment de l’instanciation. La classe implémente l’interface Comparable pour trier les clés. Lorsque la carte résultante, map1, est imprimée, elle imprime les clés triées dans la sortie.

Ci-dessous se trouve la sortie du bloc de code ci-dessus.

Production:

Unordered List:  1 hi11 2 3 4 9 hi0
Ordered List:  1 2 3 4 9 hi0 hi11

Trier le jeu de clés à l’aide des fonctions Java 8

Java 8 offre un privilège de programmation fonctionnelle, ce qui aide à travailler sur les fonctions de la chaîne. Dans le programme ci-dessous, on voit que l’instanciation et l’initialisation se produisent dans une instruction. Alors que dans le premier exemple de code, remplir la carte est une tâche fastidieuse. La compréhension des Streams et des fonctions pour instancier la carte en une seule déclaration est donnée ci-dessous.

Streams est une interface dans le package java.util qui offre la flexibilité de travailler sur la séquence d’opérations en une seule fois. Les Streams fonctionnent dans le pipeline où un émetteur émet les données ; il est filtré, traité, transformé et bien plus encore selon les besoins des utilisateurs.

import static java.util.AbstractMap.SimpleEntry;
import static java.util.stream.Collectors.toMap;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Stream;

public class HashMapSortByKey {
  public static void main(String[] args) {
    Map<String, String> map =
        Stream
            .of(new SimpleEntry<>("key6", "value1"), new SimpleEntry<>("key12", "value2"),
                new SimpleEntry<>("key9", "value3"))
            .collect(toMap(SimpleEntry::getKey, SimpleEntry::getValue));

    System.out.print("Unordered List: ");
    for (String s : map.keySet()) {
      System.out.print(" " + s);
    }
    Map<String, String> mapSortedByKey =
        map.entrySet()
            .stream()
            .sorted(Map.Entry.<String, String>comparingByKey().reversed())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                (oldVal, newValue) -> oldValue, LinkedHashMap::new));

    System.out.println();
    System.out.print("Ordered List: ");
    for (String s1 : mapSortedByKey.keySet()) {
      System.out.print(" " + s1);
    }
  }
}

Comprendre la fonction de Stream d’initialisation de carte en Java

Premièrement, le Stream appelle la fonction of() qui renvoie le Stream spécifié dans l’ordre séquentiel. La fonction crée des objets de la classe SimpleEntry pour créer des mappages de la forme clé-valeur. La classe implémente l’interface Entry et possède la méthode entrySet qui renvoie la vue de collection de la carte.

Une fois les entrées clé-valeur formées, les valeurs sont collectées sur une carte à l’aide de la fonction collector. Il s’agit d’une fonction terminale, ce qui signifie qu’aucune autre méthode ne peut être invoquée après la fonction de collecte. La fonction regroupe ou lie les valeurs de Stream dans les structures de données souhaitées.

L’entrée donnée en paramètre est toujours une référence Collector. Le toMap est une fonction statique de la classe Collectors qui renvoie un Collector qui lie les éléments du Stream dans une Map. La fonction prend une clé Mapper et une clé Value Function comme paramètre. Maintenant, l’opérateur de référence de méthode :: signifie appeler les fonctions de la classe spécifiée.

Dans le key Mapper, la fonction getKey extrait la clé du Stream EntrySet renseigné. De même, dans la fonction Key Value, la fonction getValue est appelée pour obtenir la valeur du Stream EntrySet.

Les variables Collector Function du code ci-dessus sont les interfaces fonctionnelles en Java qui ont une seule méthode abstraite pour la fonctionnalité. Les définitions de la méthode abstraite sont définies dans des classes qui les implémentent.

Comprendre la fonction Map Transformation Stream en Java

Sur l’instance map qui vient de se former, la fonction entrySet est invoquée. La fonction renvoie la vue définie des entrées de la carte et est présente dans l’interface Carte. Sur ces entrées, la méthode stream est appelée pour convertir les entrées dans le Stream séquentiel. Au fil du Stream d’entrées, la fonction sorted est invoquée.

Il faut un Comparator pour comparer les éléments Stream. La fonction triée renvoie finalement le Stream trié des entrées données. La fonction comparingByKey renvoie le comparateur Map.Entry avec l’ordre par défaut sur la clé. Le comparateur renvoie un jeu de clés ; si une clé trouvée est nulle, elle lève NullPointerException à partir de la fonction.

Lorsque l’ensemble d’entrées est récupéré, la fonction reversed est appelée pour inverser l’ordre des éléments dans la collection. Enfin, la fonction collect est invoquée sur le Stream de la carte. La fonction est un opérateur de terminal, et par conséquent, aucune opération ne peut être appelée après la fonction collect. Dans la fonction, la fonction toMap est appelée pour transformer le Stream en carte.

La fonction prend quatre paramètres : le keyMapper est une fonction qui produit des clés, le valueMapper est une fonction de mappage qui crée ses valeurs, le mergeFunction est un BinaryOperator qui fusionne une fonction, et le mapSupplier est une fonction Supplier qui renvoie une nouvelle carte vide où les résultats sont insérés. Enfin, la sortie de la console résultante est imprimée ci-dessus.

Production:

Unordered List:  key12 key6 key9
Ordered List:  key9 key6 key12
Rashmi Patidar avatar Rashmi Patidar avatar

Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.

LinkedIn

Article connexe - Java HashMap