Java 将字符串收集到LinkedHashMap<;字符,整数>,字频
我需要使用stream将一个句子收集到一个映射,其中键是一个字符(顺序应该是这样的:句子中的第一个字母是映射中的第一个字母,因此我选择LinkedHashMap),值是counter,它显示重复相同字符的频率 示例输入:hello world 输出示例:h=1,e=1,l=3,o=2,w=1,r=1,d=1 这是我的密码,我不明白是什么问题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
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()
返回一个不能用收集器收集的字符串(即primitieveint
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));
}