如何将字符串列表收集到映射中,其中每个字符串都是一个键



我正在做一个练习来计算短语中的单词。

我有一个我很高兴

的正则表达式可以将短语拆分为单词标记,因此我可以使用基本循环完成工作 - 没问题。

但我想使用流将字符串收集到映射中,而不是使用基本循环。

我需要每个单词作为,现在,我只想将整数1作为值。在网上做了一些研究后,我应该能够将单词列表收集到地图中,如下所示:

public Map<String, Integer> phrase(String phrase) {
    List<String> words = //... tokenized words from phrase
    return words.stream().collect(Collectors.toMap(word -> word, 1));
}

我已经尝试过这个,以及几种变体(使用 Function.identity() word 进行转换(,但不断收到错误:

The method toMap(Function<? super T,? extends K>, Function<? super T,? extends U>) in the type Collectors is not applicable for the arguments ((<no type> s) -> {}, int)

到目前为止,我找到的任何示例仅使用字符串作为值,否则表明这应该没问题。

我需要更改什么才能完成这项工作?

要克服编译错误,您需要:

return words.stream().collect(Collectors.toMap(word -> word, word -> 1));

但是,这将导致Map的所有值均为 1,如果 words 中有重复的元素,则会得到异常。

您需要

Collectors.groupingByCollectors.toMap与合并函数一起使用来处理重复值。

例如

return words.stream().collect(Collectors.groupingBy(word -> word, Collectors.counting()));

return words.stream().collect(Collectors.toMap(word -> word, word -> 1, Integer::sum));

相关内容

  • 没有找到相关文章

最新更新