Comment trier une HashMap par clés en Java

On a vu comment trier une HashMap par valeurs. Dans ce tutoriel, vous allez voir comment ordonner les éléments par clés en utilisant la classe TreeMap. On sait que HashMap ne garde pas l'ordre d'insertion des éléments par défaut. En java, Map ou HashMap peuvent être triées toute les deux par clés ou valeurs.

1- Trier HashMap à l'aide de TreeMap

Ce code fait le tri de HashMap par clés et il est basé sur l'utilisation de  la classe TreeMap.

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

public class Triclés {

public static void main(String[] args) {

Map<String,String> hmap = new HashMap<String,String>();
hmap.put("4", "quatre");
hmap.put("2", "deux");
hmap.put("3", "trois");
hmap.put("1", "un");

Set set = hmap.entrySet();
Iterator iterator = set.iterator();
System.out.println("Avant le tri: ");
while(iterator.hasNext()) {
Map.Entry me = (Map.Entry)iterator.next();
System.out.print(me.getKey() + ": ");
System.out.println(me.getValue());
}

Map sortedMap = new TreeMap(hmap);

Set set2 = sortedMap.entrySet();
Iterator iterator2 = set2.iterator();
System.out.println("Après le tri: ");
while(iterator2.hasNext()) {
Map.Entry me2 = (Map.Entry)iterator2.next();
System.out.print(me2.getKey() + ": ");
System.out.println(me2.getValue());
}
}
}
Sortie:

Avant le tri: 
3: trois
2: deux
1: un
4: quatre
Après le tri:
1: un
2: deux
3: trois
4: quatre

2- Trier HashMap avec Comparator ou Comparable

Vous pouvez ausiii trier une Map en copiant les clés dans une liste qui implémente l'interface java.util.List, puis trier les éléments en appelant la méthode Collections.sort(). Ici, vous pouvez utiliser les deux interfaces de tri: Comparator ou Comparable et choisir l'ordre croissant ou décroissant que vous voulez afficher. Une fois que la liste des clés est créée, vous pouvez copier les clés et les valeurs dans une nouvelle HashMap.

import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class Triclés {

public static HashMap<String, String> trierHashMap(Map<String, String> hmap){
List<Map.Entry<String, String>> list =
new LinkedList<Map.Entry<String, String>>( hmap.entrySet() );
Collections.sort( list, new Comparator<Map.Entry<String, String>>(){
public int compare
(Map.Entry<String, String>o1, Map.Entry<String, String> o2 )
{
//comparer deux clés
return (o1.getKey()).compareTo( o2.getKey() );
}
});

//créer une nouvelle HashMap à partir de LinkedList
HashMap<String, String> hmapTriee = new LinkedHashMap<String, String>();
for (Map.Entry<String, String> entry : list)
{
hmapTriee.put( entry.getKey(), entry.getValue() );
}
return hmapTriee;
}

public static void main(String[] args) {

final HashMap<String, String> hmap = new HashMap<String, String>();

hmap.put("4", "quatre");
hmap.put("2", "deux");
hmap.put("3", "trois");
hmap.put("1", "un");

System.out.println("Avant le tri: "+ hmap);

System.out.println("Après le tri: "+trierHashMap(hmap));
}
}
Sortie:

Avant le tri: {3=trois, 2=deux, 1=un, 4=quatre}
Après le tri: {1=un, 2=deux, 3=trois, 4=quatre}