我有一個初始列表與每個主題的主題和短語。JAVA加速列表過濾
public class Subject {
private String subject_name;
private List<Phrase> phrases;
}
public class Phrase {
private String phrase_name;
}
我需要過濾初始科目列表(應該得到另一個列表),條件是短語名稱應符合在輸入文本的話。 所以,如果我有作爲輸入列表:
subjects :
[
{
subject_name : "black",
phrases :
[
phrase_name : "one",
phrase_name : "two",
phrase_name : "three"
]
},
{
subject_name : "white",
phrases :
[
phrase_name : "qw",
phrase_name : "as",
phrase_name : "do",
phrase_name : "oopopop"
]
},
{
subject_name : "green",
phrases :
[
phrase_name : "rrr",
phrase_name : "ppo"
]
}
]
,我必須爲輸入文本= "one year today some rrr"
,最後我需要得到下面的列表
subjects :
[
{
subject_name : "black",
phrases :
[
phrase_name : "one"
]
},
{
subject_name : "green",
phrases :
[
phrase_name : "rrr"
]
}
]
下面做工精細的代碼,我得到想要的結果,但是當我需要根據文本大小過濾例如20000「文本」時,會花費我一些時間〜5分鐘的主題,所以速度很慢。
private List<Subject> filterSubjects(List<Subject> subjects, String text) {
List<Subject> result = new ArrayList<Subject>();
for (Subject subject : subjects) {
List<Phrase> p = new ArrayList<Phrase>();
for (Phrase phrase : subject.getPhrases()) {
String regex = "\\b(" + replaceSpecialChars(phrase.getName()).toLowerCase() + ")\\b";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
p.add(phrase);
}
}
if (!p.isEmpty()) {
result.add(new Subject.SubjectBuilder(subject.getSubjectId(), subject.getName())
.setWeight(subject.getWeight()).setColor(subject.getColor())
.setOntologyId(subject.getOntologyId()).setCreatedBy(subject.getCreatedBy())
.setUpdatedBy(subject.getUpdatedBy()).setPhrases(p).build());
}
}
return result;
}
我也試圖與流,但因爲我不希望過濾初始主題列表中,但需要得到一個新的,不爲我工作:
subjects = subjects.stream()
.filter(s -> s.getPhrases().parallelStream()
.anyMatch(p -> text.matches(".*\\b" + replaceSpecialChars(p.getName().toLowerCase()) + "\\b.*")))
.collect(Collectors.toList());
subjects.parallelStream()
.forEach(s -> s.getPhrases().removeIf(p -> !text.matches(".*\\b"
+ replaceSpecialChars(p.getName().toLowerCase())
+ "\\b.*")));
編輯
這裏是分析的結果
您是否分析了它以查看最大的熱點? – Kayaman
我剛剛做了,整個時間都被這種方法消耗掉了。第二名是replaceSpecialChars。 –
正則表達式可能不是這裏最好的選擇。 [使用JSON解析器](https://stackoverflow.com/questions/2591098/how-to-parse-json-in-java)。 – Michael