删除LinkedList中所有出现的单词



我试图获得一种方法,从链表(单词)中删除所有单词的出现。我所做的方法删除了所有的出现,但不包括第一个?下面是我的remove方法:

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);
}

If words was:

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

对"add"运行removeAll命令后的输出将是:

 words = "add","hello"

有人知道为什么第一次出现不会被删除吗?谢谢!

如果像这样在列表中向前迭代并删除项,则不会删除所有相邻的匹配项。

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

  • 索引初始为0,列表为[add, add]
  • 你发现add在索引0。
  • 删除元素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可以被实现来利用列表内部实现的知识,从而允许有效的迭代和删除。

最新更新