Подсчитайте вхождение каждой буквы в предложении, используя поток - PullRequest
0 голосов
/ 02 июня 2018

Я бы хотел посчитать вхождение каждой буквы в предложении и сохранить результат в Map<Character, Integer>.Это можно легко сделать с помощью простого цикла, но в качестве упражнения я хотел бы написать его с использованием потока.Я думал об использовании collect(toMap()) для создания карты, значениями которой являются сами символы (поэтому я использовал Function.identity()) и количество вхождений.Я придумал следующий (некомпилируемый) код:

"a simple sentence".chars()                
.collect(toMap(Collectors.partitioningBy(Function.identity(), 
Collectors.counting())));

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Вы на самом деле близки, чтобы завершить начатое, вам нужно использовать промежуточную операцию mapToObj и коллектор groupingBy вместо partitioningBy следующим образом:

Map<Character, Long> result = "a simple sentence".chars()
                .mapToObj(c -> (char) c)
                .collect(groupingBy(Function.identity(),
                        counting()));

или если вы хотите, чтобы ключи карты были строками, вы можете сделать:

Map<String, Long> result = "a simple sentence".chars()
                .mapToObj(c -> String.valueOf((char) c))
                .collect(groupingBy(Function.identity(),
                        counting()));

или если вы хотите, чтобы встречались все символы кроме символа пробела:

Map<String, Long> result = "a simple sentence".chars()
                .filter(c -> !Character.isSpaceChar(c))
                .mapToObj(c -> String.valueOf((char) c))
                .collect(groupingBy(Function.identity(),
                        counting()));

или используяшаблон:

Map<String, Long> result = 
     Pattern.compile("\\s+")
            .splitAsStream("a simple sentence")
            .flatMap(s -> Arrays.stream(s.split("")))
            .collect(groupingBy(Function.identity(),
                        counting()));

более эффективная версия с использованием шаблона:

Map<String, Long> result = 
     Pattern.compile("") 
            .splitAsStream("a simple sentence")
            .filter(s -> !s.trim().isEmpty())
            .collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));
0 голосов
/ 02 июня 2018

Попробуйте следующее:

String string ="a simple sentence";
Map<String, Long> map = 
 Arrays.stream(string.split("")).
 collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...