java - 从 Java 8 中的单词字典中计算文本的值

标签 java algorithm java-8

我在 Java 8 View 中转换算法时遇到问题。

我有一个由文章组成的arrayList

ArrayList<Article> listArticles = new ArrayList<>();

文章是这样写的

public class Article {
    private String titleArticle;
    private String abstractArticle;
    private String textArticle;
    private Long value;
}

在另一边,我有单词映射,每个单词都有一个关联的值

HashMap<String, Long> dictionary = new HashMap<>();

我想获取一篇文章的值(value)。一篇文章的值(value)是根据标题、摘要和正文中的字数(全部加在一起)计算的

在 Java 7 中我会做这样的事情(我希望我没有在这里犯任何错误)

for(Article article : dataArticles){
    double valueArticle = 0;

    for(Map.Entry<String, Long> word : dataDictionary.entrySet()){

         //looping through the words in the title
         for(String text : article.getTitle().split(" ")){
            if(text.equalsIgnoreCase(word.getKey())){
                valueArticle += word.getValue();
            }
         }
         //looping through the words in the abstract
         for(String text : article.getAbstractText().split(" ")){
            if(text.equalsIgnoreCase(word.getKey())){
                valueArticle += word.getValue();
            }
         }
         //looping through the words in the abstract
         for(String text : article.getText().split(" ")){
            if(text.equalsIgnoreCase(word.getKey())){
                valueArticle += word.getValue();
            }
         }
    }

    article.setValue(valueArticle);
}

如何通过减少时间过程来计算Array中每篇文章的值(value)?
我正在考虑使用 lambda,但也许这是一种糟糕的方法。
我是 Java 8 的新手,正在尝试学习它。

经过一些开发

仍在寻找如何使用流制作我的ArrayList。与此同时,我也想按照从最高文章值(value)到最低文章值(value)的顺序整理列表。 我想象它会是这样的

Comparator<Article> byArticleValue = (a1, a2) ->
Integer.compare(a1.getValue(), a2.getValue());
dataArticles.stream()
        .sorted(byArticleValue);

但我的列表未排序。在这种情况下我做错了什么?

最佳答案

HashMap 可以进行非常快速的查找。如果稍微重新组织一下代码,就可以节省大量的运行时间。

long getValueOfText(String text) {
    long value = 0;
    for(String word : text.split(" ")) {
        Long v = dataDictionary.get(word);
        if (v != null) {
            value += v;
        }
    }
    return value;
}

get 的调用几乎是免费的。无论您在 map 中存储了多少单词,查找一个单词都需要一定的时间。

编辑:它看起来比 Java 8 流好一些

long getValueOfText(String text) {
    return Arrays.stream(text.split(" "))
                .map(word -> dataDictionary.get(word))
                .filter(v -> v != null)
                .reduce(Long::sum).get();
}

关于java - 从 Java 8 中的单词字典中计算文本的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31278692/

相关文章:

java - 使用 Java8 将一个对象映射到另一个(DTO)

algorithm - 重新平衡访问列表以获得更好的内存效率

python - 递归模式获取输入整数并返回回文

algorithm - 如何擅长数据结构和分析?

java - 在 map 中加入 List<String>

java - 为什么 java 中没有 Optional 的公共(public)构造函数?

java - 无法访问java泛型类的方法

Java WebView : "Failed to read the ' cookie' property from 'Document' : Access is denied for this document"

java - 在 Java lambda 中使用两个流来计算协方差

java - 我无法从 jUnit 测试中删除错误?