删除LinkedList中单词的所有出现

时间:2015-10-25 11:50:11

标签: java linked-list applet

我试图找到一个方法,从链接列表中删除所有出现的单词(单词)。我制作的方法删除了所有的事件,但不是第一个?这是我的删除方法:

public void removeAll(){
    for(int x = 0; x < words.size(); x++){
        if(words.get(x).equalsIgnoreCase(inputWord)){
            words.remove(x);
        }
    }
    out2.setText("Word '" + inputWord + "' all occurrence's have been removed.");
    System.out.println(words);
}

如果有话:

 words = "add","hello","add","add"

运行removeAll for“add”后的输出将是:

 words = "add","hello"

任何人都知道为什么第一次出现不会被删除?谢谢!

1 个答案:

答案 0 :(得分:3)

如果您通过这样的列表向前迭代,并删除项目,则不会删除所有相邻的匹配项目。

例如,如果您的列表为[add, add],并且您要删除add

  • 最初索引为0,列表为[add, add]
  • 您在索引0处找到add
  • 删除元素0,现在列表为[add]
  • 增量索引,现为index == 1
  • 索引现在大于或等于列表大小,因此您可以打破循环
  • 最终列表为[add]

如此有效地“跳过”第二次添加。

解决此问题的一种方法是在删除元素后减少index。 有些人(引用需要)在改变for循环体内的迭代变量时皱眉。这使得正确性有点难以推理。

另一种方法是反向迭代列表,这是有效的,因为你没有改变你尚未检查的列表部分:

for(int x = words.size() - 1; x >= 0; x--){

但是,最好的方法是使用Iterator

Iterator<String> it = words.iterator();
while (it.hasNext()) {
  if (it.next().equalsIgnoreCase(inputWord)) {
    it.remove();
  }
}

请注意,LinkedList.get(int)是一个O(list.size())操作,因此您并不想真正使用它来按顺序访问您的元素。可以实现Iterator以利用列表内部实现的知识,以允许有效的迭代和删除。