簡體   English   中英

刪除LinkedList中一個單詞的所有出現

[英]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

  • 索引最初是0,列表是[add, add]
  • 您在索引0找到add
  • 刪除元素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以利用列表的內部實現的知識來實現​​高效的迭代和刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM