Java 8计算ArrayLists的ArrayList中每个String的重复数

And*_*rei 0 java-8 java-stream collectors

我需要计算每个字符串的出现次数

ArrayList<ArrayList<String>>
Run Code Online (Sandbox Code Playgroud)

我知道如何使用旧的java 7及以下方法,但是想要使用流和收集器来实现它

理想情况下,我会将结果保存在HashMap<String, Integer>,其中integer是多次出现而String是相应的字符串.

反之亦然 - 这不是什么大问题.

我找到了解决方法如何在这里做到这ArrayList 一点

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

但我的情况更复杂,因为它是一个ArrayListArrayList秒.

结构如下 String itemId = list.get(i).getProducts().get(j).getItemId();

Hol*_*ger 6

如果要计算出现次数,无论字符串出现在哪个子列表中,都可以使用

Map<String, Long> counts = list.stream().flatMap(List::stream)
   .collect(Collectors.groupingBy(e -> e, Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)

如果具有Integer值类型对您很重要,您可以使用

Map<String, Integer> counts = list.stream().flatMap(List::stream)
    .collect(Collectors.groupingBy(e -> e, Collectors.summingInt(x -> 1)));
Run Code Online (Sandbox Code Playgroud)

代替.

此外,基于传统循环的解决方案也可以受益于Java 8功能:

Map<String, Integer> counts = new HashMap<>();
for(List<String> l: list)
    for(String s: l)
        counts.merge(s, 1, Integer::sum);
Run Code Online (Sandbox Code Playgroud)