2017-02-10 50 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