我试图获得一种方法,从链表(单词)中删除所有单词的出现。我所做的方法删除了所有的出现,但不包括第一个?下面是我的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
可以被实现来利用列表内部实现的知识,从而允许有效的迭代和删除。