2013-10-19 21 views
2

我不斷收到此錯誤刪除的字符串:從數組列表

java.lang.IndexOutOfBoundsException: Index: 3, Size: 3

我想去掉字符串「梅格」,它將編譯,但我不斷收到此錯誤。

import java.util.ArrayList; 

public class CustomerLister2 { 
    public static void main (String[] args) { 

     ArrayList<String> name = new ArrayList<String>(); 

     name.add("Chris"); 
     name.add("Lois"); 
     name.add("Meg"); 
     name.add("Meg"); 
     name.add("Brain"); 
     name.add("Peter"); 
     name.add("Stewie"); 

     for (int i = 0; i < name.size(); i++){ 
      name.get(i); 
      name.remove(i); 
      name.set(i,"Meg"); 
     } 

     for(String names: name){ 
      System.out.println(names); 
     } 
    } 
} 
+0

'name.set(i,「Meg」);''的用途是什麼? –

回答

2

調用remove()然後set()可能不是你想要做什麼。也許你只是想撥打set()覆蓋該索引處的現有元素,而不刪除?

Remove從列表中刪除一個元素,添加一個元素,僅當指定的索引存在時才設置。

for (int i = 0; i < name.size(); i++){ 
    String oldName = name.get(i); 
    name.set(i, "Meg"); 
} 
1

ArrayLists的大小是可變的。當你做name.remove(i)時,列表變小。然後嘗試將該元素設置爲不存在的索引。您可能不需要name.remove(i)或將name.set(我,「Meg」)更改爲name.add(i,「Meg」)。

http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

編輯

另外請注意,你的代碼是在索引我刪除每一個元素。這可能就是爲什麼你每次都在索引3處得到例外的原因。您刪除元素0並且列表變小。然後刪除元素1,列表變小。依此類推,直到你在for循環中得到i == 3,並且列表中只有3個元素。

+0

我相信在這種情況下,指數3仍然存在。 –

+0

@JeroenVannevel在每次迭代之後,列表大小減少1,在第四次迭代時(當i是3時),當調用set(3)時列表的大小爲3。 –

+0

當拋出異常時,OP的列表如下所示:''Lois「,」Meg「,」Peter「'。 – Radiodef

5

,如果你想刪除"Meg"然後通過該算法使用

import java.util.ArrayList; 

public class CustomerLister2 { 
    public static void main (String[] args) { 

     ArrayList<String> name = new ArrayList<String>(); 

     name.add("Chris"); 
     name.add("Lois"); 
     name.add("Meg"); 
     name.add("Meg"); 
     name.add("Brain"); 
     name.add("Peter"); 
     name.add("Stewie"); 


     for (int i = 0; i < name.size(); i++){ 
      String tempName = name.get(i); 
      if(tempName.equals("Meg"){ 
       name.remove(i); 
      } 
     } 

     for(String names: name){ 
      System.out.println(names); 
     } 
    } 
} 
6

讓我們跟蹤。

我們從這個列表開始。我們將按照插入順序對Megs進行編號,以便更容易跟蹤(已有兩個,我們正在用「Meg」替換其他名稱)。

0: Chris 
1: Lois 
2: Meg#1 
3: Meg#2 
4: Brain 
5: Peter 
6: Stewie 

我們先從i=0,並呼籲name.remove(0)。所以,指數0(克里斯)被刪除,所有剩餘的元素左移(下指數):

0: Lois 
1: Meg#1 
2: Meg#2 
3: Brain 
4: Peter 
5: Stewie 

注意,列表現在是一個元素小。

呼叫name.set(0)用Meg(#3)代替索引0(現在的Lois)。

0: Meg#3 
1: Meg#1 
2: Meg#2 
3: Brain 
4: Peter 
5: Stewie 

這就結束了循環的第一遍。現在i=1

我們剔除指數1(MEG#1),這給我們留下了:

0: Meg#3 
1: Meg#2 
2: Brain 
3: Peter 
4: Stewie 

而代替指數1兆(#4):

0: Meg#3 
1: Meg#4 
2: Brain 
3: Peter 
4: Stewie 

現在i=2。刪除索引2:

0: Meg#3 
1: Meg#4 
2: Peter 
3: Stewie 

與梅格替換指數2(彼得)(#5)

0: Meg#3 
1: Meg#4 
2: Meg#5 
3: Stewie 

現在i=3。刪除索引3:

0: Meg#3 
1: Meg#4 
2: Peter 

現在我們嘗試設置索引3,但它不存在。所以我們得到一個例外。

java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 

這表明列表具有3個元素(大小= 3),我們試圖訪問索引3(但是現在的最大下標爲2)。

+0

我認爲最終名單是「Lois,Meg,Peter」。我忘了添加。布拉沃。 – Radiodef

0

刪除(索引)將刪除該項目並將其餘項目移到上面。

對於i = 0,之後循環場景是 -

克里斯刪除。
0微克(重寫在洛伊絲)
1微克
2微克
3腦
4彼得
5 stewei

對於i = 1,之後循環場景是
0微克
(MEG刪除的索引轉移)
1兆(覆蓋最後一個兆字節)
2大腦
3彼得
4 stewei

對於i = 2後的循環
0微克
1微克
(腦刪除,索引移位)
2彼得
3 stewei

對於i = 3 時stewei被刪除
0微克
1微克
2彼得

沒有索引3可用....因此錯誤即將到來。