ArrayList Java中的IndexOutOfBoundsException

ArrayList Java中的IndexOutOfBoundsException,java,arraylist,Java,Arraylist,每当我尝试运行代码时,我都会收到IndexOutOfBoundsException。我已经尝试了很多方法来修复它,但是没有一个能起到作用。该方法应在每个长度等于4的字符串之前向ArrayList中添加一个新的字符串元素“**”。在这种情况下,必须在“5555”之前添加“**” 问题出在哪里 import java.util.ArrayList; public class Main { public static ArrayList<String> markLength4(

每当我尝试运行代码时,我都会收到IndexOutOfBoundsException。我已经尝试了很多方法来修复它,但是没有一个能起到作用。该方法应在每个长度等于4的字符串之前向ArrayList中添加一个新的字符串元素“**”。在这种情况下,必须在“5555”之前添加“**”

问题出在哪里

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));
    }
}
import java.util.ArrayList;
公共班机{
公共静态ArrayList标记长度4(ArrayList列表){
整数和=0;
对于(int i=0;i
列表。索引of(i)
将返回
-1
,因为
i
不会出现在您的列表中。因此,在
-1
位置添加元素将引发异常


如果将
list.add(list.indexOf(i),“****”
更改为
list.add(i),“****”
,您将得到一个无限循环,该循环将以
OutOfMemoryError
结束,因为新添加的
字符串也有一个
长度()
为4,因此下一次迭代中将添加另一个
字符串,依此类推。

i
不在您的数组列表中-它是
字符串的列表,不是
整数
。这意味着
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, "****");
  }
}
list.indexOf(i)
其中
i
是一个int,因此不在列表中会抛出注释中所述的错误(索引-1)

使用以下任一选项:

list.add(“str”)
将字符串添加到列表末尾


list.set(i,“****”
,它将在给定索引处为新字符串设置值。

在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;
}
公共静态ArrayList标记长度4(ArrayList列表){
int i=0;
布尔值=false;
int pos=0;
而(i
列表。列表中不存在索引(i)。它将产生-1

-1在ArrayList中不可用

更换线路 列表。添加(列表索引(i),“****”

用下面的一行

列表.集合(i,“****”)

它将列表的现有内容替换为索引i中的新元素,并替换为新元素,即(****)

import java.util.ArrayList;
公开课考试{
公共静态ArrayList标记长度4(ArrayList列表){
整数和=0;
对于(int i=0;i
您将以这种方式永远循环,因为向前有4个加长字符串,您将不断添加…
你可以通过从末尾循环来解决这个问题,但是你必须小心你的索引(你应该增加索引以避免这种情况)

编辑
列表后,添加(i++,“****”)代码应该可以正常工作

值得注意
如果要在使用
i++之前添加

如果要在比赛后添加,请使用
++i

i
不在您的数组列表中-它是
字符串的列表,而不是
整数。这意味着
list.indexOf(i)==-1
。你的意思是
list.add(i,“****”)
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);
        }
    }
}