Comment trier une Map par valeurs en Java ?

On peut trier une map en utilisant la classe treemap ainsi qu'un comparateur. Une treemap est une map avec une organisation en forme d'arbre.

Il est possible en Java de stocker des données dans une map. Une map est une collection qui associe une clé à une valeur. La clé doit être unique mais la valeur peut être la même pour plusieurs clés.

On peut trier une map en utilisant la classe treemap ainsi qu'un comparateur. Une treemap est une map avec une organisation en forme d'arbre, ce qui permet de retrouver plus facilement un élément. Pour que l'objet treemap trie les éléments, on peut associer à sa création un comparateur qui lui permet de comparer les éléments entre eux. Pour obtenir ce comparateur, il suffit de créer une classe implémentant l'interface Comparator. Il faut ensuite à l'intérieur de ce comparator réécrire la méthode compare(), qui compare deux éléments A et B. La méthode retourne -1 si le premier élément est inférieure au deuxième, 1 si c'est l'inverse, et 0 s'ils sont de même ordre. Pour utiliser une treemap, il est recommandé de ne jamais retourner 0 dans la méthode de comparaison car la treemap fusionnera alors les deux éléments. Exemple :

public class Testing {
public static void main(String[] args) {
HashMap<String,Double> map = new HashMap<String,Double>();
ValueComparator comparateur = new ValueComparator(map);
TreeMap<String,Double> mapTriee = new TreeMap<String,Double>(comparateur);
map.put(A,99.5);
map.put(B,67.4);
map.put(C,65.2);
System.out.println(map non-triée: +map); //La commande suivante affichera map non-triée: {A=99.5, B=67.4, C=65.2}.
mapTriee.putAll(map);
System.out.println(resultat du tri: + mapTriee); //La commande suivante affichera résultat: {C=65.2, B=67.4, A=99.5}.
}
}

class ValueComparator implements Comparator<String> {
Map<String, Double> base;
public ValueComparator(Map<String, Double> base) {
this.base = base;
}

public int compare(String a, String b) {
if (base.get(a) >= base.get(b)) {
return -1;
} else {
return 1;
}
}
}