[英]Removing all occurrencs of a word in a LinkedList
我試圖獲得一種方法,該方法可以從鏈接列表(單詞)中刪除所有出現的單詞。 我采用的方法會刪除所有出現的內容,但不會刪除第一個出現的內容? 這是我的刪除方法:
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"
在為“ add”運行removeAll之后,輸出為:
words = "add","hello"
有誰知道為什么第一次出現不會被刪除? 謝謝!
如果您迭代這樣的列表,然后刪除項目,則不會刪除所有相鄰的匹配項目。
例如,如果您的列表是[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
以利用列表的內部實現的知識來實現高效的迭代和刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.