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
985 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!

source:php.cn
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