Maison >Java >javaDidacticiel >Comment puis-je trier un TreeMap par ses valeurs, et non par ses clés ?
Tri d'un TreeMap par valeur
Un TreeMap est une carte triée où les clés sont triées par ordre croissant selon leur ordre naturel. Si un tri personnalisé est requis en fonction des valeurs, il est nécessaire d'utiliser un comparateur qui évalue les valeurs à la place.
Une tentative de mise en œuvre d'un tel comparateur pourrait ressembler à ceci :
class byValue implements Comparator<Map.Entry<String, Integer>> { public int compare(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2) { if (e1.getValue() < e2.getValue()) { return 1; } else if (e1.getValue() == e2.getValue()) { return 0; } else { return -1; } } }
Cependant, cette approche est imparfaite car un TreeMap ne peut pas trier uniquement sur la base de valeurs. Il est conçu pour trier ses clés, pas les valeurs associées à ces clés.
Solution alternative : trier Map.Entry
Pour surmonter cette limitation, une collection externe peut être utilisé pour trier la collection Map.entrySet(). Cet ensemble trié permet de filtrer et de trier en fonction des valeurs. Voici une méthode générique qui trie Map.entrySet() par valeurs :
static <K, V extends Comparable<? super V>> SortedSet<Map.Entry<K, V>> entriesSortedByValues(Map<K, V> map) { SortedSet<Map.Entry<K, V>> sortedEntries = new TreeSet<>( new Comparator<Map.Entry<K, V>>() { @Override public int compare(Map.Entry<K, V> e1, Map.Entry<K, V> e2) { int res = e1.getValue().compareTo(e2.getValue()); return res != 0 ? res : 1; } } ); sortedEntries.addAll(map.entrySet()); return sortedEntries; }
En utilisant cette méthode, un ensemble trié de Map.Entries peut être obtenu en fonction de valeurs, comme démontré ci-dessous :
Map<String, Integer> map = new TreeMap<>(); map.put("A", 3); map.put("B", 2); map.put("C", 1); System.out.println(map); // prints "{A=3, B=2, C=1}" System.out.println(entriesSortedByValues(map)); // prints "[C=1, B=2, A=3]"
Remarque sur l'égalité entière
Il convient de noter que le code fourni utilise == pour comparer les valeurs entières. Ceci n’est généralement pas recommandé car cela vérifie l’égalité des références et non l’égalité des valeurs. Dans certains scénarios, cela peut conduire à des résultats inattendus. Il est préférable d'utiliser des méthodes comme compareTo() pour les comparaisons de valeurs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!