Java 删除LinkedList中出现的所有单词

Java 删除LinkedList中出现的所有单词,java,linked-list,applet,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.setTe

我试图得到一个方法,删除的所有出现的一个字从一个链表(字)。我使用的方法会删除所有引用,但不会删除第一个引用?以下是我的删除方法:

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);
}
为“add”运行removeAll后的输出为:

 words = "add","hello"

有人知道为什么第一次发生的情况不会被删除吗?谢谢

如果向前遍历这样的列表并删除项,则不会删除所有相邻的匹配项

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

  • 索引最初是0,列表是
    [添加,添加]
  • 您可以在索引0处找到
    add
  • 删除元素0,现在列表是
    [add]
  • 增量索引,现在
    index==1
  • 索引现在大于或等于列表大小,因此可以中断循环
  • 最后的列表是
    [添加]
所以实际上你“跳过”了第二个添加

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

另一种方法是反向迭代列表,因为您没有更改列表中尚未检查的部分:

for(int x = words.size() - 1; x >= 0; x--){
但是,最好的方法是使用
迭代器

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

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

反向迭代列表。实际上,我不确定为什么您的代码没有删除第一个列表。但是要反向迭代,或者使用迭代器。如果在arrayList中进行修改,内部数组会自动重新排列。因此,最好使用集合或迭代器来删除重复项。我强烈建议您使用调试器逐步完成此操作。我相信您会立即看到问题所在。您确定输出不是
“hello”,“add”
?我想这是你最后一次没能把它去掉。这真是太棒了,谢谢你!Iv以前从未使用过迭代器,因此必须对其进行更多的研究。非常感谢。
Iterator<String> it = words.iterator();
while (it.hasNext()) {
  if (it.next().equalsIgnoreCase(inputWord)) {
    it.remove();
  }
}