我在 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/