Java : trier une Map par valeurs

Les maps sont utilisées dans le langage Java pour stocker rapidement une association entre une clé et une valeur. Cette classe est conçue pour être rapide et facile d'accès mais ne peut pas être triée. Pour trier une map en fonction des valeurs, il est nécessaire de faire appel aux listes.

Pour réaliser cette opération, il faut d'abord créer une liste. Cette liste, de la classe linkedList, sera composée d'éléments de la classe Map.Entry. La méthode entrySet() de la classe Map va retourner une collection d'entrées de map. Avec la liste, on peut utiliser la méthode Collections.sort(). Cette méthode permet de trier une liste selon un comparateur. Le comparateur en question est une fonction qui compare entre elles chaque valeur. Une fois le tri effectué, on recrée une map. On parcourt la liste et on insère chaque élément dans la nouvelle map. Il ne reste plus qu'à retourner cette map triée.

import java.util.*;
public class utilitaireMap
{
public static > Map
sortByValue( Map map )
{
//On crée la liste à partir des entrées de la map
List> liste =
new LinkedList>( map.entrySet() );
Collections.sort( liste, new Comparator>()
{
//Fonction de comparaison qui compare entres elles les valeurs de chaque entrée
@Override
public int compare( Map.Entry entree1, Map.Entry entree2 )
{
//Le tri se fait dans l'ordre ascendant. Il faut modifier cette ligne
//si vous souhaitez changer l'ordre de tri
return (entree1.getValue()).compareTo(entree2.getValue());
}
} );
//Une fois le tri terminé, on crée une map dans laquelle on insère les entrées triées,
//puis on la retourne
Map resultat = new LinkedHashMap();
for (Map.Entry entree : liste)
{
resultat.put(entree.getKey(), entree.getValue());
}
return resultat;
}
}

Si vous utilisez Java 8, il est possible de simplifier la fonction. La méthode stream() permet de traiter la map comme une séquence d'éléments. Ensuite la méthode sorted() va trier les objets selon la fonction passée en paramètre. Pour trier la map selon la valeur des entrées, il faudra utiliser la méthode Map.Entry.ComparingByValue(). Pour terminer, la méthode collect() va être utilisée pour collecter les éléments triés dans une nouvelle map.

public static > Map sortByValue(Map map) {
return map.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new
));
}

Le tri se fait dans l'ordre ascendant. Si vous souhaitez inverser le tri, il faut ajouter en argument de la fonction Map.Entry.comparingByValue() la méthode Collections.reverseOrder().

Java