2016-02-09 74 views
2

每當我嘗試運行代碼時,我都會得到IndexOutOfBoundsException。我嘗試了很多方法來修復它,但沒有一個能夠幫助。在每個長度等於4的String之前,該方法應該在ArrayList中添加一個新的String元素「****」。在這種情況下,它必須在「5555」之前添加「****」。ArrayList中的IndexOutOfBoundsException Java

問題出在哪裏?

import java.util.ArrayList; 

public class Main { 

    public static ArrayList<String> markLength4(ArrayList<String> list) { 

     int sum = 0; 
     for (int i = 0; i < list.size(); i++) { 
      if (list.get(i).length() == 4) { 
       list.add(list.indexOf(i), "****"); 
      } 
     } 
     return list; 
    } 

    public static void main(String[] args) { 

     ArrayList<String> list = new ArrayList<>(); 
     list.add("ddddddddddddd"); 
     list.add("fffffffffffff"); 
     list.add("5555fdgdfg"); 
     list.add("5555"); 
     list.add("5555"); 

     System.out.println(markLength4(list)); 
    } 
} 
+4

'i'不在你的數組列表中 - 它是'String'的列表,而不是'Integer'。這意味着'list.indexOf(i)== -1'。你只是指'list.add(我,「****」);'? –

回答

-1

在markLength4方法中,通過在for循環中添加元素,您不斷添加字符串並增加列表大小。你需要一個標誌來告訴索引,然後結束循環。你可以嘗試這樣的事情

public static ArrayList<String> markLength4(ArrayList<String> list) { 

    int i = 0; 
    boolean found = false; 
    int pos = 0; 

    while(i < list.size() && !found){ 
     if (list.get(i).length() == 4) { 
      found = true; 
      pos = i; 
     } 
     i++; 
    } 
    list.add(pos, "****"); 
    return list; 
} 
2

list.indexOf(i)將返回-1,因爲i沒有出現在列表中。因此,在-1位置添加一個元素將會引發異常。

如果更改list.add(list.indexOf(i), "****")list.add(i, "****");,你會得到一個無限循環,將與OutOfMemoryError結束,因爲新加入的String也有length() 4,所以另一個String將在下一次迭代中添加,等等。

1

i不在您的數據列表中 - 它是String列表,而不是Integer。那意味着list.indexOf(i) == -1

從你的描述,我覺得你的意思是:

list.add(i, "****"); 

但你也將需要增加i,例如

list.add(i++, "****"); 

避免Eran提到的無限循環。

或者,當然了,你可以向後遍歷列表,並避免無限循環/需要改變循環體內的循環變量:

for (int i = list.size() - 1; i >= 0; i--) 
{ 
    if (list.get(i).length() == 4) 
    { 
    list.add(i, "****"); 
    } 
} 
0

list.indexOf(i)其中i是int,因此不您的列表將拋出您的錯誤,如評論(索引-1)中所述。

,可以使用以下的:

list.add("str")將字符串添加到列表的末尾

OR

list.set(i, "****")將定索引處的值設置爲這個新的字符串。

0

list.indexOf(i)不在列表中。這將產生-1

-1不是ArrayList中

可更換線路 list.add(名單。indexOf(i),「****」);

用以下行

list.set(i,「****」);

它更換新的元素列表的現有內容在我的新元素,即(****)

1
import java.util.ArrayList; 

public class Test { 

    public static ArrayList<String> markLength4(ArrayList<String> list) { 
     int sum = 0; 
     for (int i = 0; i < list.size(); i++) { 
      if (list.get(i).length() == 4) { 
       list.add(i++, "****"); 
      } 
     } 
     return list; 
    } 

    public static void main(String[] args) { 
     ArrayList<String> list = new ArrayList<>(); 
     list.add("ddddddddddddd"); 
     list.add("fffffffffffff"); 
     list.add("5555fdgdfg"); 
     list.add("5555"); 
     list.add("5555"); 
     list = markLength4(list); 
     for (String x : list) { 
      System.out.println(x); 
     } 
    } 
} 

索引你會永遠循環下去,這樣一來,因爲有4加長字符串向前,你不斷添加...
你可以通過從最後循環來解決這個問題,但你必須小心你的索引(你應該增加和增加索引以避免這種情況)

編輯後代碼應該工作得很好。

值得注意
如果你想使用i++;前添加。
如果你想添加後匹配使用++i;

相關問題