【问题标题】:Collect String to LinkedHashMap <Character, Integer> , with frequency of characters将字符串收集到 LinkedHashMap <Character, Integer> ,以字符的频率
【发布时间】:2020-08-29 12:58:07
【问题描述】:

我需要使用stream将一个句子收集到一个map中,其中key是一个字符(顺序应该是这样的:句子中的第一个字母是map中的第一个,所以我选择LinkedHashMap),并且值是计数器,显示重复相同字符的频率。

示例输入: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(Collector) 方法的IntStream。使用.chars().mapToObj(i -&gt; (Character)i) 获取Stream&lt;Character&gt;。然后,您不需要在 toMap 中进行类型转换。
  • 如果您对Map&lt;Character, Long&gt; 没问题,您也可以只使用Collectors.counting()。超级简单、紧凑、易读。

标签: java collections java-stream


【解决方案1】:

String.chars() 返回一个IntStream(即原始ints 流),不能用Collectors.toMap 收集。

您可以将其映射到 Character 对象,一旦您这样做了,您就可以使用 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 不保留流的顺序,所以你真的必须像你所做的那样手动实现它。 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));
}

【讨论】:

  • 请注意,由于Collectors.counting(),此解决方案使用Map&lt;Character, Long&gt; 而不是Integer
猜你喜欢
  • 2021-05-14
  • 1970-01-01
  • 2019-04-05
  • 2021-12-08
  • 2014-06-19
  • 2021-07-15
  • 1970-01-01
  • 2016-05-18
  • 2017-04-19
相关资源
最近更新 更多