2017-07-07 1 views
1

Voici ma fonction:occurrences de comptage et liste à l'intérieur le nombre de commandes de la liste par DESC

public static void countKeywords(List<String> list) { 
    Map<String, Long> counts = 
      list.stream().collect(Collectors.groupingBy(e -> e, Collectors.counting())); 
    System.out.println(counts); 
} 

Et voici l'échantillon qu'il génère:

{alarm=2, player=1, factory=3} 

je besoin d'être commandé par nombre d'occurrences dans la direction descendante. Donc, la sortie doit être comme:

factory - 3 
    alarm - 2 
    player - 1 

Qu'est-ce que je fais mal?

+0

Avez-vous essayé en utilisant Collections.sort? – ZeldaZach

+0

@ZeldaZach où exactement? – att13

+0

Je me sens comme c'est un problème de devoirs, alors je vais vous laisser comprendre cette partie :) – ZeldaZach

Répondre

1

Le problème est la structure de données que vous utilisez. Une carte normale ne garantit pas l'ordre ou le tri. Si vous définissez l'utilisation d'une carte comme structure, je voudrais jeter un oeil à l'API TreeMap. Il vous permet de définir un comparateur dans votre constructeur de carte.

https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html

public static void countKeywords(List<String> list) { 
    Map<String, Long> counts = list.stream().collect(Collectors.groupingBy(e -> e, Collectors.counting())); 
    System.out.println(counts); 

    TreeMap<String, Long> sortedMap = new TreeMap<String, Long>(new Comparator<String>() { 
     @Override 
     public int compare(String key1, String key2) { 
      return counts.get(key2).compareTo(counts.get(key1)); 
     } 
    }); 

    sortedMap.putAll(counts); 
    System.out.println(sortedMap); 
} 
+0

comment voulez-vous changer mon code? – att13

+0

@ att13 J'ai ajouté le code ci-dessus – Steve

+0

incroyable. que diriez-vous de sa performance? – att13