繁体   English   中英

收集字符串到 LinkedHashMap<character, integer> , 字符出现频率</character,>

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM