2017-09-14 67 views
4

我正在尝试计算已选择的不同文章中关键字的出现次数。 我可以在java 7中做到这一点,但在java 8中挣扎。计算多篇文章中的关键字出现次数

结构是这样的。

关键字类

public class Keyword { 

    private String word; 
    private int value; 
} 

Article类

public class Article { 
    private Set<Keyword> keywordsList; 
    private boolean selected; 
} 

我怎么算我有A,B,C,...等的时间数量。关键字

Map<Keyword,Integer> occurrenceMapping = new HashMap<>(); 

final Set<Article> articleSetFiltered = articleSet.stream() 
      .filter(a -> a.isSelected()) 
      .collect(Collectors.toSet()); 

    for(Article a : articleSetFiltered) { 
     for(Keyword k : a.getKeywordsList()) { 
      if(!occurrenceMapping.containsKey(k)) { 
       occurrenceMapping.put(k,1); 
      } 
      else{ 
       final int occurrence = occurrenceMapping.get(k); 
       occurrenceMapping.put(k,occurrence+1); 
      } 
     } 
    } 

我开始做这样的事情。仍然围绕着它,但不知道我正在朝着好的方向前进:/如果有人能指引我朝着正确的方向发展,那会很棒!

Map<Keyword,Integer> occurenceMappingBis = articleSetFiltered = articleSet.stream() 
      .filter(a -> a.isSelected()) 
      .forEach(
      article -> article.getKeywordsList() 
        .stream().collect(Collectors.groupingBy(keyword -> keyword, Collectors.counting())) 
    ); 

回答

5

就像这样(我还没有编译它,但应该工作)。这假设Keyword重写hashcode/equals

articleSet.stream() 
      .filter(Article::isSelected) 
      .flatmap(ar -> ar.getKeywordsList().stream()) 
      .collect(Collectors.groupingBy(
        Function.identity(), 
        Collectors.counting())); 
+0

关键字会覆盖hashcode/equals方法。谢谢。我会试一试 – kanadianDri3