Trier une hashmap par valeur et ordre inverse
Résolu
charline159
Messages postés
208
Date d'inscription
Statut
Membre
Dernière intervention
-
charline159 Messages postés 208 Date d'inscription Statut Membre Dernière intervention -
charline159 Messages postés 208 Date d'inscription Statut Membre Dernière intervention -
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:
mais j'ai l'erreur suivante:
Pourtant ma méthode est bien static, donc je ne vois pas comment je pourrais résoudre ça?
Merci pour votre aide
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
A voir également:
- Trier une hashmap par valeur et ordre inverse
- Excel trier par ordre croissant chiffre - Guide
- Annuaire inversé - Guide
- Ecran inversé - Guide
- Slash inversé ✓ - Forum MacOS
- Comment taper le anti slash? ✓ - Forum Programmation
1 réponse
Bonjour,
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 :
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]
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 !