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