使用Java中的另一个Arraylist循环遍历ArrayList

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循环?

Nic*_*olt 6

你的代码中存在一些效率低下的问题,但是在一天结束的时候,如果你必须搜索包含单词的句子,那么就无法摆脱循环.

也就是说,有几件事要尝试.

首先,制作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原始代码中的连接和解析逻辑(将其替换为单个正则表达式),这两者都应该更快.

但请记住,就像所有表现一样,你需要测试这些变化,看看它们能改善这种情况.