Maison >Java >javaDidacticiel >Comment puis-je trier un HashMap par valeurs, en conservant l'ordre des clés ?

Comment puis-je trier un HashMap par valeurs, en conservant l'ordre des clés ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-26 17:25:10482parcourir

How Can I Sort a HashMap by Values, Maintaining Key Order?

Tri d'une HashMap par valeurs

Problème :
Comment une HashMap peut-elle être triée en fonction des valeurs stockées dedans, garantissant que les clés sont automatiquement triées par ordre bien ?

Solution :

Méthode générique (pré-Java 8) :

Implémenter une méthode générique pour trier un map :

private static <K extends Comparable<K>, V extends Comparable<V>> Map<K, V> sort(
        final Map<K, V> unsorted,
        final boolean order) {
    final var 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(
                    Entry::getKey, Entry::getValue, (a, b) -> b, LinkedHashMap::new
            )
    );
}

Utilisation avec Ascendant et Descendant Commande :

import java.util.HashMap;
import java.util.Map;

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

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

        // Sort in ascending order
        Map<String, Integer> sortedMapAsc = sort(unsortMap, ASC);

        // Sort in descending order
        Map<String, Integer> sortedMapDesc = sort(unsortMap, DESC);
    }
}

Fonctionnalités Java 8 et supérieures plus récentes :

Alternativement, une solution plus concise utilisant des expressions lambda Java 8 :

import java.util.*;
import java.util.Map.Entry;
import java.util.stream.Collectors;

public class SortMapByValue {
    ...

    private static Map<String, Integer> sortByValue(Map<String, Integer> unsortMap, final boolean order) {
        List<Entry<String, Integer>> list = new LinkedList<>(unsortMap.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(Entry::getKey, Entry::getValue, (a, b) -> b, LinkedHashMap::new));
    }

    ...
}

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