我有一个初始列表与每个主题的主题和短语。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