2011-11-17 62 views
1

所以我有這個數組,我想刪除長度爲2或4個字符(包含2或4個字符的字符串)的字符串。我正在做這個方法,但它不起作用,即使在邏輯上它應該工作。如何刪除特定長度的字符串

public static void main(String[] args) 
{ 
    ArrayList<String> list = new ArrayList<String>(); 
    list.add("This"); 
    list.add("is"); 
    list.add("a"); 
    list.add("test"); 
    for (int i=0; i<list.size(); i++) 
    { 
     if(list.get(i).length()==2 || list.get(i).length()==4) 
     { 
      list.remove(i); 
     } 

    } 
} 

我想堅持這種做法。你能給我一些關於如何糾正這些代碼的建議嗎?

這段代碼的輸出,當我運行它是:

[is, a] 

即使我想要的輸出爲

[a] 

,因爲「是」長2個字符。

回答

7

該列表正在改變。從最後一個元素迭代到第一個或使用迭代器。

+0

是的,它的工作!謝謝 –

+1

以及接受答案然後:-)雖然我更喜歡在這種情況下使用迭代器,如bringer128的答案中所示 – aishwarya

6

PeterPeiGuo是對的 - 你正在移除正在改變你的索引的元素。

這是迭代器的主要候選者。

Iterator<String> it = list.iterator(); 
while(it.hasNext()) { 
    String val = it.next(); 
    if(val.length() == 4 || val.length() == 2) { 
    it.remove(); 
    } 
} 
0

從列表中刪除東西會更改列表中其餘東西的索引。

當您的代碼運行時,在第一次迭代中,i爲0,它將刪除「this」條目爲0. 在第二次迭代中,i爲1,因此它不檢查0處的值,即現在「是」,因爲「this」已被刪除。

正如PeterPeiGui在他的回答中所說的那樣,在這種特殊情況下你可以通過倒退來解決它,但是遍歷一個集合並同時進行變異總是會引入大量的混淆。

1

它的另一種選擇: 當你刪除一個,減少你的索引1. 順便說一句,它的工作原理,但不是一個好的編碼風格。

for (int i=0; i<list.size(); i++) 
{ 
    if(list.get(i).length()==2 || list.get(i).length()==4) 
    { 
     list.remove(i); 
     i--; 
    } 
} 
相關問題