2016-02-09 80 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;

相关问题