【发布时间】:2022-01-07 09:43:12
【问题描述】:
我有一个List<Films> films,其中每部电影都有int id 和String description。
我的任务是将所有描述中的每个单词映射到描述中包含该单词的所有电影名称,它必须是这样的:
<word1>: <filmId11>, <filmId12>,..., <filmId1N>
<word2>: <filmId21>, <filmId22>, ..., <filmId2N>
...
我使用 Java Stream API 做到了:
private List<Map.Entry<String, String>> wordToFilmIds;
private void addWordsFromDescriptions(List<Film> films) {
for (Film film : films) {
String description = film.description();
String[] tokens = description.split("[\\p{IsPunctuation}\\p{IsWhite_Space}]+");
allWords.addAll(Arrays.stream(tokens).toList());
}
}
private void mapWordsToFilmIDs(List<Films> films) {
wordToFilmIds = allWords.stream()
.map(word -> Map.entry(word,
films.stream()
.filter(film -> film.description().contains(word))
.map(film -> String.valueOf(film.id()))
.collect(Collectors.joining(","))))
.toList();
}
但问题是我的解决方案太慢了,我必须处理大数字,电影的数量约为 12 000,而且描述也不短。另外,我被not 允许使用multi-threading。
知道如何优化它吗?
现在程序还没有结束。
我也尝试过使用parallel streams,但还是不行。
【问题讨论】:
-
阅读inverted indexes,然后根据电影描述中的所有文字构建
HashMap<String, Set<Film>>,您的世界将会改变。 -
我是编程新手,还没有听说过。非常感谢!
标签: java performance java-stream