Gre*_*dot 3 java arrays arraylist
我有一个大型的句子列表和另一个单词列表.
我的程序循环遍历数组列表,如果句子包含来自另一个的任何单词,则从该数组列表中删除一个元素.
句子数组列表可能非常大,我编写了一个快速而脏的嵌套for循环.虽然这适用于没有多少句子的情况,但是在它们是的情况下,完成此操作所需的时间非常长.
for (int i = 0; i < SENTENCES.size(); i++) {
for (int k = 0; k < WORDS.size(); k++) {
if (SENTENCES.get(i).contains(" " + WORDS.get(k) + " ") == true) {
//Do something
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有更有效的方法来执行此操作然后嵌套for循环?
你的代码中存在一些效率低下的问题,但是在一天结束的时候,如果你必须搜索包含单词的句子,那么就无法摆脱循环.
也就是说,有几件事要尝试.
首先,制作WORDSa HashSet,该contains方法将比a 更快,ArrayList因为它正在进行哈希查找以获取值.
其次,切换逻辑有点像这样:
Iterator<String> sentenceIterator = SENTENCES.iterator();
sentenceLoop:
while (sentenceIterator.hasNext())
{
String sentence = sentenceIterator.next();
for (String word : sentence.replaceAll("\\p{P}", " ").toLowerCase().split("\\s+"))
{
if (WORDS.contains(word))
{
sentenceIterator.remove();
continue sentenceLoop;
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码(假设您尝试删除包含某些单词的句子)使用Iterators并避免使用string原始代码中的连接和解析逻辑(将其替换为单个正则表达式),这两者都应该更快.
但请记住,就像所有表现一样,你需要测试这些变化,看看它们能改善这种情况.