【问题标题】:Counting keyword occurrences in multiple articles计算多篇文章中的关键字出现次数
【发布时间】:2017-09-14 14:02:06
【问题描述】:

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

结构是这样的。

关键词类

public class Keyword {

    private String word;
    private int value;
}

文章类

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()))
    );

【问题讨论】:

    标签: java arrays java-8 java-stream


    【解决方案1】:

    类似这样的东西(我没有编译它,但应该可以)。这假设Keyword 覆盖hashcode/equals

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

    【讨论】:

    • 关键字确实会覆盖 hashcode/equals 方法。谢谢。我试试看
    猜你喜欢
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2010-11-26
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多