我试图找到一个方法,从链接列表中删除所有出现的单词(单词)。我制作的方法删除了所有的事件,但不是第一个?这是我的删除方法:
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"
任何人都知道为什么第一次出现不会被删除?谢谢!
答案 0 :(得分:3)
如果您通过这样的列表向前迭代,并删除项目,则不会删除所有相邻的匹配项目。
例如,如果您的列表为[add, add]
,并且您要删除add
:
[add, add]
。add
。[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
以利用列表内部实现的知识,以允许有效的迭代和删除。