Tableau de fréquences en Java avec les Streams
Contenu
Pour contextualiser, je traduis ici par tableau de fréquences l’expression anglaise de frequencies map.
Vous avez une liste d’éléments et vous voulez pour chaque élément connaître sa fréquence (le nombre de fois où il est présent dans cette liste) : ainsi à partir de cette liste d’éléments, vous désirez obtenir un tableau associatif dans lequel chaque clé est un élément de cet liste et est associé à sa fréquence dans la liste.
Avant Java 8 et les Streams, vous deviez parcourir la liste d’éléments et compter la fréquence d’un élément en maintenant un tableau associatif avec cet élément comme clé et la fréquence de cet élément comme valeur associée. Rien d’insurmontable mais cela représente un bon petit pavé de code à produire.
|
|
Avec les Streams
on peut faire plus court (et plus simple si on apprécie une approche fonctionnelle).
|
|
Il y a juste une petite limitation à cette approche telle que présentée ci-dessus : pourquoi diable utiliser nécessairement des long
? Et si je veux utiliser des int
?
Collectors.counting
retourne un Long
donc on ne peut pas l’utiliser directement. A la place on va utiliser java.util.stream.Collectors.summingInt
(on notera que java.util.stream.Collectors.counting
utilise java.util.stream.Collectors.summingLong
) ce qui nous donne :
|
|
Voilà si vous avez besoin de créer un tableau de fréquences en Java et que vous souhaitez le faire avec un oneliner, vous avez les éléments pour le faire. Le gist avec les différents exemples en une seule classe Java.
Je me suis demandé comment faire un tableau de fréquences avec les Streams
en Java, car confronté à un problème similaire en Clojure j’avais découvert la fonction frequencies et si vous pratiquez un peu les fold
/reduce
dans des approches fonctionnelles vous voyez assez rapidement que c’est une opération de ce type dans laquelle vous réduisez votre liste en ce tableau de fréquences.
MAJ : j’ai fait un billet sur le même thème en Python.
Auteur TGITS
Modifié 2020-10-04