Maison >Java >javaDidacticiel >Comment puis-je trier un TreeMap par ses valeurs, et non par ses clés ?

Comment puis-je trier un TreeMap par ses valeurs, et non par ses clés ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-23 05:59:23193parcourir

How Can I Sort a TreeMap by its Values, Not Keys?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn