2017-02-10 47 views
-1

的ArrayList中每串8计数我需要计算在Java的重复中的ArrayList

ArrayList<ArrayList<String>> 

我知道如何做到这一点的旧的Java 7和下面的方法出现次数为每串的,但想要使用流和收集器来做

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

这可以反之亦然 - 没什么大不了的。

我找到解决方案如何做到这一点的ArrayListhere

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

,但我的情况更复杂,因为它是ArrayList秒的ArrayList

的情况如下 String itemId = list.get(i).getProducts().get(j).getItemId();

+4

你是什么意思与“算重复数”?你是不是指“发生次数”? – Holger

回答

5

如果你要计算出现的次数,无论在哪个子列表中的字符串出现,你可以,如果有Integer为值使用

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

类型对你很重要,你可以使用

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

改为。

此外,基于传统的环路的解决方案也可以受益于Java的八大特点:

Map<String, Integer> counts = new HashMap<>(); 
for(List<String> l: list) 
    for(String s: l) 
     counts.merge(s, 1, Integer::sum); 
+0

我收到以下错误(对于您提到的第一个选项)。在这条线 多个标记 \t - 流不能得到解决 \t - 类型不匹配:不能从流转换为 \t Andrei

+0

好吧,如果它说,“流解决不了”,你有你的项目设置的严重问题,因为上面的代码不包含任何对'Stream'的引用。但是,请检查您是否正确导入了您正在使用的每种类型。或者你的意思是“流”(小写)?上面的代码假定你有一个'ArrayList >',正如你在问题中所陈述的那样,而不是在5天后有一个'getProducts()'方法。 – Holger

+0

您可以通过将'.flatMap(List :: stream)'修改为'.flatMap(o-> o.getProducts()。stream())'来解决这个问题,但是在将来您可以提供正确的问题描述首先发布您的问题。 – Holger