Maison > Java > javaDidacticiel > Comment puis-je trier un Java HashMap par ses valeurs par ordre croissant et décroissant ?

Comment puis-je trier un Java HashMap par ses valeurs par ordre croissant et décroissant ?

Mary-Kate Olsen
Libérer: 2024-12-03 05:24:09
original
1044 Les gens l'ont consulté

How can I sort a Java HashMap by its values in ascending and descending order?

Tri d'un HashMap par valeurs

En Java, un HashMap est une collection non triée de paires clé-valeur. Pour trier un HashMap par ses valeurs, nous pouvons utiliser des algorithmes de tri externes, car le HashMap lui-même ne fournit pas de méthode de tri intégrée.

Une approche courante consiste à convertir le HashMap en une liste chaînée de ses valeurs. entrées, triez la liste chaînée par valeur, puis reconstruisez le HashMap. Pour garantir que les paires clé-valeur restent liées pendant ce processus, nous utilisons un comparateur qui compare les valeurs tout en préservant l'ordre clé-valeur d'origine.

L'extrait de code suivant illustre cette approche :

import java.util.*;

public class HashMapSorting {
    private static final boolean ASC = true;
    private static final boolean DESC = false;

    public static void main(String[] args) {
        // Creating dummy unsorted HashMap
        HashMap<String, Integer> unsortedMap = new HashMap<>();
        unsortedMap.put("B", 55);
        unsortedMap.put("A", 80);
        unsortedMap.put("D", 20);
        unsortedMap.put("C", 70);

        System.out.println("Before sorting...");
        printMap(unsortedMap);

        System.out.println("After sorting ascending order...");
        Map<String, Integer> sortedMapAsc = sortByValue(unsortedMap, ASC);
        printMap(sortedMapAsc);

        System.out.println("After sorting descending order...");
        Map<String, Integer> sortedMapDesc = sortByValue(unsortedMap, DESC);
        printMap(sortedMapDesc);
    }

    private static <K extends Comparable<K>, V extends Comparable<V>> Map<K, V> sortByValue(Map<K, V> unsorted, final boolean order) {
        List<Map.Entry<K, V>> list = new LinkedList<>(unsorted.entrySet());

        list.sort((o1, o2) -> order
                ? o1.getValue().compareTo(o2.getValue()) == 0
                  ? o1.getKey().compareTo(o2.getKey())
                  : o1.getValue().compareTo(o2.getValue())
                : o2.getValue().compareTo(o1.getValue()) == 0
                  ? o2.getKey().compareTo(o1.getKey())
                  : o2.getValue().compareTo(o1.getValue()));
        return list.stream().collect(
                Collectors.toMap(
                        Map.Entry::getKey, Map.Entry::getValue, (a, b) -> b, LinkedHashMap::new
                )
        );
    }

    private static void printMap(Map<String, Integer> map) {
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
        }
    }
}
Copier après la connexion

Ce code illustre le tri par ordre croissant et décroissant en implémentant un comparateur qui évalue les valeurs tout en préservant les relations clé-valeur d'origine.

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal