3 votes

Compter les occurrences de caractères dans une chaîne de caractères avec stream

J'essaie de comprendre un flux de données de flux en Java. Ma tâche consiste à placer les occurrences de chaque lettre dans une liste de chaînes de caractères.

List<String> words = Arrays.asList("Welcome", "to", "the", "java", "world");

en

Map<String, Long>

en utilisant un flux en une seule ligne.

Je sais que, dans un premier temps, nous pouvons streamer chaque mot de la liste, puis je dois le séparer en caractères, puis mettre chaque caractère comme clé et compter son occurrence comme valeur et enfin retourner la carte entière.

C'est tellement compliqué à comprendre. Quelqu'un pourrait-il m'expliquer comment faire ?

9voto

nullpointer Points 1135

Cela pourrait être fait comme Willis l'a indiqué en utilisant la fonction flatMap y groupingBy collecteur. Mais, le type de sortie attendu devrait être Map<Character, Long> comme dans :

Map<Character, Long> charFrequency = words.stream() //Stream<String>
        .flatMap(a -> a.chars().mapToObj(c -> (char) c)) // Stream<Character>
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

2voto

Willis Blackburn Points 980

La chose que vous devez savoir est que flatMap est la fonction que vous pouvez utiliser pour convertir les chaînes de caractères en caractères individuels. Alors que les chaînes régulières map convertit simplement chaque élément du flux en un élément différent, flatMap convertit chaque élément en un flux d'éléments, puis concatène ces flux ensemble.

La fonction qui convertit un String dans un flux de caractères est String.chars .

Lorsque vous souhaitez créer une nouvelle collection à partir d'un flux, vous utilisez généralement un collecteur. En utilisant la fonction Collectors.groupingBy vous pouvez produire un collecteur qui créera un Map On lui donne deux fonctions, l'une pour produire la clé de chaque valeur de flux, et l'autre pour produire la valeur. Il existe une variante de cette méthode qui vous permet de passer un autre collecteur en tant que second paramètre au lieu d'une fonction ; essayez donc Collectors.counting .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X