Trier une hashmap par valeur et ordre inverse

Résolu/Fermé
charline159 Messages postés 212 Date d'inscription lundi 14 août 2017 Statut Membre Dernière intervention 22 juin 2022 - 3 nov. 2021 à 23:36
charline159 Messages postés 212 Date d'inscription lundi 14 août 2017 Statut Membre Dernière intervention 22 juin 2022 - 4 nov. 2021 à 17:46
Bonjour. Je cherche à trier une hashmap selon ses valeurs. J'ai pu trouver différentes implémentations sur internet mais il y a toujours quelque chose qui cloche.

Ma hashmap<String, Integer> correspond à des mots et leur fréquence, et j'aimerais pouvoir récupérer les mots les plus fréquents, autrement dit:

- trier la hashmap selon sa valeur (fréquence), en ordre décroissant
- puis ensuite stocker les clés dans une ArrayList<String>

j'ai par exemple essayé ceci:

public static <K,V> void sortByFrequence(ListeL listeL){

        Map map = listeL.getListeL();
        Stream<Map.Entry<K,V>> sorted =
                map.entrySet().stream()
                        .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()));

        Map<K,V> topHundred = map.entrySet().stream()
                        .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
                        .limit(100)
                        .collect(Collectors.toMap(
                                Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
    }


mais j'ai l'erreur suivante:
Non-static method cannot be referenced from a static context


Pourtant ma méthode est bien static, donc je ne vois pas comment je pourrais résoudre ça?

Merci pour votre aide

1 réponse

KX Messages postés 16664 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 21 janvier 2023 2 999
Modifié le 4 nov. 2021 à 09:48
Bonjour,

public static <K,V> void sortByFrequence(ListeL listeL){

A priori tes paramètres K et V ne servent à rien ici puisque tu auras toujours une Map de String et d'Integer dans ListeL.
De plus, pour récupérer le résultat de ton tri, il te faut un type de retour, void ne convient pas. Tu parles d'une ArrayList<String> mais ça n'apparaît nul part dans ton code.

Bref, tout est à revoir. Voici un exemple :
Map<String, Integer> map = new HashMap<>();
map.put("a", 2);
map.put("b", 1);
map.put("c", 3);
map.put("d", 1);
System.out.println(map); // {a=2, b=1, c=3, d=1}

Map<Integer, Set<String>> reverseMap = map.entrySet().stream()
        .collect(Collectors.groupingBy(Entry::getValue,
                Collectors.collectingAndThen(
                        Collectors.toSet(),
                        entries -> entries.stream()
                                .map(Entry::getKey)
                                .collect(Collectors.toSet()))));
System.out.println(reverseMap); // {1=[b, d], 2=[a], 3=[c]}

List<String> list = reverseMap.entrySet().stream()
        .sorted(Comparator.comparing(Entry::getKey, Comparator.reverseOrder()))
        .flatMap(e -> e.getValue().stream())
        .collect(Collectors.toList());
System.out.println(list); // [c, a, b, d]

0
charline159 Messages postés 212 Date d'inscription lundi 14 août 2017 Statut Membre Dernière intervention 22 juin 2022 1
Modifié le 4 nov. 2021 à 17:46
Déjà, merci pour ta réponse.

De plus, pour récupérer le résultat de ton tri, il te faut un type de retour, void ne convient pas. Tu parles d'une ArrayList<String> mais ça n'apparaît nul part dans ton code. 


Effectivement, à la base j'avais bien mis un retour de type ArrayList<String> mais j'avais une erreur en lien avec le type générique T que je n'arrivais pas à résoudre, du coup j'ai fini par essayer de "bricoler" autre chose (méthode avec retour void, mais en parallèle mise à jour d'une arraylist créée au préalable, par exemple en attribut).

J'aurais peut-être dû utiliser une List dès le début (et pas une ArrayList), j'aurais peut-être eu moins de soucis...

du coup je viens de tester ton code, il marche parfaitement, j'ai juste fait un downcast pour stocker le return de type List en ArrayList.

Je suis restée bloquée sur ce problème un moment, merci encore à toi !
0