计算字符串出现次数的最佳方法/数据结构

时间:2018-09-04 06:44:53

标签: java counting find-occurrences word-frequency

让我们假设我有很长的字符串列表。我想计算每个字符串出现的次数。我不知道字符串的数量和种类(意思是:我没有所有可能的字符串的字典)

我的第一个想法是创建一个Map,并在每次再次找到密钥时增加整数。

但这有点笨拙。有没有更好的方法来计算这些字符串的所有出现次数?

3 个答案:

答案 0 :(得分:4)

从Java 8开始,最简单的方法是使用流:

Map<String, Long> counts =
    list.stream().collect(
        Collectors.groupingBy(
            Function.identity(), Collectors.counting()));

在Java 8之前,您当前概述的方法很好用。 (而且Java 8+的方法也做基本相同的事情,只是语法更简洁)。

答案 1 :(得分:1)

您也可以在没有流的情况下进行操作:

Map<String, Long> map = new HashMap<>();

list.forEach(x -> map.merge(x, 1L, Long::sum));

答案 2 :(得分:0)

如果您确实需要特定的数据结构,则可以随时查看Guava's Multiset

用法与此类似:

List<String> words = Arrays.asList("a b c a a".split(" "));

Multiset<String> wordCounts = words.stream()
  .collect(toCollection(HashMultiset::create));

wordCounts.count("a"); // returns 3
wordCounts.count("b"); // returns 1
wordCounts.count("z"); // returns 0, no need to handle null!