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
Libérer: 2024-11-26 17:25:10
original
534 Les gens l'ont consulté

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 :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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

            )

    );

}

Copier après la connexion

Utilisation avec Ascendant et Descendant Commande :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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);

    }

}

Copier après la connexion

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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));

    }

 

    ...

}

Copier après la connexion

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