2013-11-03 70 views
-1

我正在嘗試使用一個字符串的ArrayList作爲參數並從中刪除所有甚至長度的字符串的方法。這是我到目前爲止有:從ArrayList中刪除字符串

public void removeEvenLength(ArrayList<String> items) { 
    for (String s : items) { 
     if (s.length() % 2 == 0) items.remove(s); 
    } 
} 

出於某種原因,這是行不通的,它顯示了一個錯誤,當我試圖與它的任何元素的ArrayList運行它。有人能告訴我爲什麼嗎?先謝謝您的幫助。

+0

在遍歷列表中刪除列表中的項目是很危險的。嘗試使用'while'循環和'Iterator'('items.iterator()')。然後調用'iterator.remove()'方法來刪除當前項目。 –

+4

任何時候你都在問一個錯誤*,因爲宙斯之後發佈錯誤*。在這種情況下,顯然有什麼不對,但這是一個好主意。 – roippi

回答

3

您不能從List中刪除項目,並且同時運行循環。對此使用iterator

List<String> items = .... 
Iterator<String> it = items.iterator(); 
while (it.hasNext()) { 
    String s = it.next(); 
    if (s.length() % 2 == 0){ 
     it.remove(); 
    } 

} 
+0

其實我可以使用循環並從列表中刪除項目。問題只是增強for循環,它創建自己的迭代器,它會在列表被修改並引發異常時發出通知。 – Pshemo

1

必須使用長篇大論的成語:

for (Iterator<String> it = items.iterator(); it.hasNext();) 
    if (it.next().length() % 2 == 0) it.remove(); 

原因:你的增強了循環編譯成如上只是這樣的代碼,並在您使用的Iterator,你是不是允許通過除Iterator#remove之外的其他路由來更改基礎列表,以便迭代器知道刪除。

+1

我喜歡你的方式2行,但我會如何調試? –

+0

我不使用調試器,所以我不習慣使代碼適應這種擔憂。如果我有這樣的代碼有堆棧跟蹤問題,那麼我暫時分割這一行。你可以做同樣的調試。順便說一句,實際上我會使用一行代碼,我已經拆分它只是由於SO代碼框的限制:) –

+0

首先,選擇短代碼的可讀性大部分時間沒有用,只是提及我的想法。其次,你忘記了for循環中的第二個分號。 – Pr0gr4mm3r