3
votes

Fonction de regroupement Java 8 pour renvoyer Map au lieu de Map

J'utilise le code mentionné ci-dessous pour trouver le nombre de fois où chaque mot s'est produit dans une chaîne.

Map<String, Integer> map1 = 
 map.entrySet().parallelStream().collect(Collectors.toMap(entry -> entry.getKey(), entry -> Integer.valueOf(entry.getValue())));

ce code renvoie Map Je souhaite transformer ce code pour renvoyer Map . J'ai essayé de faire cela en utilisant le code ci-dessous,

Mais cela lance ClassCastException java.lang.Integer ne peut pas être converti en java.lang.Long

Map<String, Long> map = Arrays.asList(text.split("\\s+")).stream().collect(Collectors.groupingBy(Function.identity(),LinkedHashMap::new,Collectors.counting()))

S'il vous plaît, aidez-moi à résoudre ce problème, j'en ai besoin pour retourner la carte


4 commentaires

Pouvez-vous montrer les déclarations complètes? (y compris les variables auxquelles vous attribuez les résultats).


entry -> Integer.valueOf (entry.getValue ())) à entry.getValue (). intValue () ?


@Eran Veuillez vérifier les mises à jour.


Y a-t-il un moyen de faire la même chose sur la première étape elle-même plutôt que de le faire après, est ce que je regarde


3 Réponses :


0
votes

Vous devez convertir un long en entier dont vous avez besoin que la valeur soit o.getValue().intValue()

 Map<String, Integer> map = Arrays.asList(text.split("\\s+")).stream()
.collect(Collectors.groupingBy(Function.identity(),LinkedHashMap::new,summingInt(value -> 1)));

Il existe un moyen pour vous de placer en premier convertir en Map par summingInt (x -> 1))

Map<String, Integer> stringIntegerMap = 
stringLongMap.entrySet().stream().collect(toMap(Map.Entry::getKey, o -> 
o.getValue().intValue(), (a, b) -> b));


0 commentaires

0
votes

Collectors.counting () n'est rien de plus que Collectors.reducing (0L, e -> 1L, Long :: sum) ( source ); utilisez plutôt Collectors.reducing (0, e -> 1, Integer :: sum) et vous serez défini:

Map<String, Integer> map = Arrays.asList(text.split("\\s+")).stream().collect(Collectors.groupingBy(
    Function.identity(),
    LinkedHashMap::new,
    Collectors.reducing(0, e -> 1, Integer::sum)
));

Essayez-le ici .


0 commentaires

6
votes

Vous pouvez effectuer une conversion de Long en Integer après le comptage comme

Map<String, Integer> map = Arrays.stream(text.split("\\s+"))
    .collect(Collectors.toMap(Function.identity(), word -> 1, Integer::sum));

mais vous pouvez également compter en utilisant un int type de valeur en premier lieu:

Map<String, Integer> map = Arrays.stream(text.split("\\s+"))
    .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new,
        Collectors.summingInt(word -> 1)));

Ceci additionne un pour chaque mot. Vous pouvez utiliser la même approche avec le collecteur toMap :

Map<String, Integer> map = Arrays.stream(text.split("\\s+"))
    .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new,
        Collectors.collectingAndThen(Collectors.counting(), Long::intValue)));


0 commentaires