Java 将字符串收集到LinkedHashMap<;字符,整数>,字频

Java 将字符串收集到LinkedHashMap<;字符,整数>,字频,java,collections,java-stream,Java,Collections,Java Stream,我需要使用stream将一个句子收集到一个映射,其中键是一个字符(顺序应该是这样的:句子中的第一个字母是映射中的第一个字母,因此我选择LinkedHashMap),值是counter,它显示重复相同字符的频率 示例输入:hello world 输出示例:h=1,e=1,l=3,o=2,w=1,r=1,d=1 这是我的密码,我不明白是什么问题 private Map<Character, Integer> countSymbols(String sentence) { retu

我需要使用stream将一个句子收集到一个映射,其中键是一个字符(顺序应该是这样的:句子中的第一个字母是映射中的第一个字母,因此我选择LinkedHashMap),值是counter,它显示重复相同字符的频率

示例输入:hello world

输出示例: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));
}
私有映射计数符号(字符串语句){
返回句子。chars()
.collect(收集器).toMap(键->(字符)键,
计数器->1,
整数::和,
LinkedHashMap::new));
}
String.chars()
返回一个不能用
收集器收集的字符串(即primitieve
int
s流)。toMap

您可以将其映射到
字符
对象,一旦映射完成,就可以使用
收集器。分组
来完成繁重的工作,而不是实现其逻辑:

private Map<Character, Long> countSymbols(String sentence) {
    return sentence.chars()
                    .mapToObj(c -> (char) c)
                    .collect(Collectors.groupingBy(Function.identity(), 
                                                   Collectors.counting()));
}

chars()
返回一个没有
collect(Collector)
方法的
IntStream
。使用
.chars().mapToObj(i->(Character)i)
获取
流。然后,您不需要在
toMap
中强制转换类型。如果您对
Map
没有问题,也可以使用
collector.counting()
。超级简单、紧凑且可读。请注意,此解决方案使用的是
映射,而不是
整数,这是由于
收集器。counting()
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));
}