Исключение при удалении элементов из ArrayList? - PullRequest
0 голосов
/ 25 октября 2018

Я заполняю ArrayList al случайными целыми числами.Затем, когда я пытаюсь удалить их, я получаю следующие ошибки:

Исключение в потоке "main" java.lang.IndexOutOfBoundsException: Индекс 5000 выходит за пределы длины 5000 в java.base /jdk.internal.util.Preconditions.outOfBounds (Preconditions.java:64) в java.base / jdk.internal.util.Preconditions.outOfBoundsCheckIndex (Preconditions.java:70) в java.base / jdk.internal.util.Preconditions.checkIndex (Preconditions.java:248) в java.base / java.util.Objects.checkIndex (Objects.java:372) в java.base / java.util.ArrayList.remove (ArrayList.java:517) в a2_40038465.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 Ответ

0 голосов
/ 25 октября 2018
al.remove(i);

удаляет элемент с индексом i.В начале удаления в вашем списке 10000 предметов.После первых 5000 итераций цикла в вашем списке только 5000. Затем вы вызываете al.remove(5000), что в массиве размером 5000 больше не разрешено.На предыдущем шаге у вас было 5001 элемент в списке, и он назывался al.remove(4999), что было разрешено.

Используйте remove(0) в цикле или clear() без цикла, чтобы удалить все элементы.

Ваша основная ошибка, вероятно, заключается в том, что remove(0) и последующий remove(1) удаляют первые 2 элемента массива.Но это не тот случай.На самом деле происходит то, что первое утверждение удаляет первый элемент, после чего первоначально второй элемент становится первым, третий - вторым и т. Д. Таким образом, remove(1) после этого удаляет первоначально третий элемент.Вы бы никогда не удалили изначально второй элемент (и многие другие), если бы продолжили эту логику.

...