![](/img/trans.png)
[英]Difference between linkedhaspmap and linkedhashmap<Integer,String>
[英]Collect String to LinkedHashMap <Character, Integer> , with frequency of characters
我需要使用stream收集一个句子到map,其中key是一个字符(顺序应该是这样的:句子中的第一个字母是map中的第一个,所以我选择LinkedHashMap),值为counter它显示了重复相同字符的频率。
示例输入:你好世界
示例 output:h=1、e=1、l=3、o=2、w=1、r=1、d=1
这是我的代码,我不明白问题出在哪里。
private Map<Character, Integer> countSymbols(String sentence) {
return sentence.chars()
.collect(Collectors.toMap(key -> (Character) key,
counter -> 1,
Integer::sum,
LinkedHashMap::new));
}
String.chars()
返回一个IntStream
(即原始int
的 stream),不能用Collectors.toMap
。
您可以将其 map 转换为Character
object,完成后,您可以使用Collectors.grouping
来完成繁重的工作,而不是实现其逻辑:
private Map<Character, Long> countSymbols(String sentence) {
return sentence.chars()
.mapToObj(c -> (char) c)
.collect(Collectors.groupingBy(Function.identity(),
Collectors.counting()));
}
编辑:
Collectors.grouping
不保留 stream 的顺序,所以您真的必须像您所做的那样手动实现它。 mapToObj
调用仍然是必需的,如果你想避免计算示例中“hello”和“world”之间的空间,你需要添加一个filter
调用:
private Map<Character, Integer> countSymbols(String sentence) {
return sentence.chars()
.filter(Character::isAlphabetic)
.mapToObj(c -> (char) c)
.collect(Collectors.toMap(Function.identity(),
counter -> 1,
Integer::sum,
LinkedHashMap::new));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.