当前位置: 首页 > 知识库问答 >
问题:

从ArrayList中移除元素时出现异常?

太叔正文
2023-03-14

我正在用随机整数填充ArrayListal。然后,当我试图删除它们时,我得到了以下错误:

线程“main”java.lang.indexoutOfboundsException:在java.base/jdk.internal.util.preconditions.outofbounds(preconditions.java:64)在java.base/jdk.internal.util.preconditions.outofbounds(preconditions.java:70)在java.base/jdk.internal.util.preconditions.outofboundscheckindex(preconditions.java:248)在38465.listTester.main(ListTester.java:137)

这是我的代码:

System.out.println("-----------------------------------------------------------------------------");
    System.out.println("Inserting at the beginning...");
    long startTime4 = System.currentTimeMillis();

    for(int i=0; i<10000; i++) {
        al.add(0, rand.nextInt(20001));
    }

    long endTime4 = System.currentTimeMillis();
    long elapsed4 = endTime4 - startTime4;
    System.out.println("Time elapsed: " + elapsed4);
    System.out.println("-----------------------------------------------------------------------------");

    System.out.println("Removing from beginnig...");
    long startTime19 = System.currentTimeMillis();

    for(int i=0; i<10000; i++) {
        al.remove(i);
    }

    long endTime19 = System.currentTimeMillis();
    long elapsed19 = endTime19 - startTime19;
    System.out.println("Time elapsed: " + elapsed19);
    System.out.println("-----------------------------------------------------------------------------");

共有1个答案

齐阳
2023-03-14
al.remove(i);

移除索引i处的元素。在删除的开始,您的列表有10000个项目。在循环的前5000次迭代之后,您的列表只有5000次。然后调用al.remove(5000),这在大小为5000的数组中是不允许的。在前面的步骤中,列表中有5001个元素,并调用al.remove(4999),这是允许的。

在循环中使用remove(0)或在不使用任何循环的情况下使用clear()删除所有元素。

您的主要错误可能是认为remove(0)和随后的remove(1)删除了数组的前两个元素。但事实并非如此。实际发生的情况是,第一个语句删除第一个元素,之后最初的第二个元素变成第一个元素,第三个元素变成第二个元素,等等。所以remove(1)之后删除最初的第三个元素。如果您继续这种逻辑,您将永远不会删除最初的第二个元素(以及许多其他元素)。

 类似资料:
  • 我试图从ArrayList中删除所有奇数元素,然后返回该ArrayList。 我在第一行发现一个指向列表整数的错误 测试: 结果:

  • 问题内容: 我有这个arraylist: 如何构造语句,以便每500帧删除arraylist 中的最后一个元素?是否需要某种循环? 问题答案: 如果您已经有了一个变量,可以跟踪您所处的帧,则可以使用以下if语句: 由于您将其用作ArrayList的remove方法的参数,因此我也这样做了,但请注意,由于arrayList索引从0开始计数,因此它将始终删除arrayList中的第二个对象。 仅在帧数

  • 问题内容: 我正在使用,我想删除所有出现的特定元素。 它仅删除第一次出现的事件。但是我希望所有列表都被删除,因为我希望列表仅保留值“ second”。通过谷歌搜索发现,可以通过创建新列表并调用来实现。但是是否可以在不创建新列表的情况下删除所有出现的内容,或者是否有可用的API来实现它? 问题答案:

  • 我试图从中删除一些元素,同时像这样迭代它: 当然,当尝试在迭代的同时从列表中删除项时,我会得到一个。有没有一些简单的解决方案来解决这个问题?

  • 问题内容: 我有一堆索引,我想从中删除这些索引中的元素。我无法做一个简单的s 序列,因为每次移除后元素都会移动。我该如何解决? 问题答案: 按降序对索引进行排序,然后将其一一删除。如果这样做,删除将不会影响以后要删除的任何索引。 如何对它们进行排序将取决于您用来存储索引的集合。如果是列表,则可以执行以下操作: 编辑 @aioobe找到了我找不到的助手。除了上述内容,您还可以使用