Trier une HashMap par clé en Java
-
Trier le jeu de clés à l’aide de la classe
TreeMap
en Java - Trier le jeu de clés à l’aide des fonctions Java 8
- Comprendre la fonction de Stream d’initialisation de carte en Java
- Comprendre la fonction Map Transformation Stream 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 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