Java - Trier une TreeMap par valeurs avec Comparator

La collection TreeMap est par défaut triée avec ses clés, mais si vous avez besoin de trier TreeMap par valeurs alors Java fournit un moyen pour réaliser ça en utilisant la classe comparator.

Exemple:

package codeurjava;

import java.util.*;

class TreeMapSort {

// Trier les éléments de TreeMap par valeurs
public static > Map sortByValues(final Map map) {

Comparator valueComparator = new Comparator() {
public int compare(K k1, K k2) {
int compare = map.get(k1).compareTo(map.get(k2));
if (compare == 0)
return 1;
else
return compare;
}
};

Map TreeMap_triee_par_valeur = new TreeMap(valueComparator);
TreeMap_triee_par_valeur.putAll(map);
return TreeMap_triee_par_valeur;
}

public static void main(String args[]) {

TreeMap treemap = new TreeMap();

// elements
treemap.put("1", "e4");
treemap.put("2", "e5");
treemap.put("3", "e1");
treemap.put("4", "e3");
treemap.put("5", "e2");

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

/* parcourir la TreeMap non triée avec Iterator */

Set set = treemap.entrySet();
Iterator i = set.iterator();
// Afficher les éléments
while(i.hasNext()) {
Map.Entry entry = (Map.Entry)i.next();
System.out.print(entry.getKey() + " : ");
System.out.println(entry.getValue());
}

System.out.println("Après le tri:");
// appeler la méthode sortByvalues()
Map TreeMap_triee_par_valeur = sortByValues(treemap);

/* parcourir la nouvelle map triée avec Iterator */

set = TreeMap_triee_par_valeur.entrySet();
i = set.iterator();
// Afficher les éléments
while(i.hasNext()) {
Map.Entry entry = (Map.Entry)i.next();
System.out.print(entry.getKey() + " : ");
System.out.println(entry.getValue());
}

}
}

Exécution

Avant le tri:
1 : e4
2 : e5
3 : e1
4 : e3
5 : e2
Après le tri:
3 : e1
5 : e2
4 : e3
1 : e4
2 : e5

Références:

Java Documentation - Comparator (JavaSE 8)