让我们假设我有很长的字符串列表。我想计算每个字符串出现的次数。我不知道字符串的数量和种类(意思是:我没有所有可能的字符串的字典)
我的第一个想法是创建一个Map,并在每次再次找到密钥时增加整数。
但这有点笨拙。有没有更好的方法来计算这些字符串的所有出现次数?
答案 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!