Использование цикла for для удаления фильмов из списка. Для цикла работает один раз, затем выбрасывает исключение индекса за пределами границ - PullRequest
1 голос
/ 13 мая 2019

для цикла, предназначенного для удаления фильмов из списка фильмов.Цикл успешно работает в первый раз, но исключение цикла выходит за границы после удаления второго фильма.Список фильмов содержит 17 фильмов

Я пытался изменять значения переменной размера, а также уменьшать значение переменной размера при каждом цикле.

public String toString(){
    StringBuilder returnString = new StringBuilder();

    int newSize = 16;

    for (int i = 0; i <newSize ; i++) {
        returnString.append(i+1).append("\n");
        returnString.append("Movie title: ")
                    .append(movieList.get(i).getTitle())
                    .append("\n");
        returnString.append("Lead Actor: ")
                    .append(movieList.get(i).getActor())
                    .append("\n");
        returnString.append("Release Year: ")
                    .append(movieList.get(i).getYear())
                    .append("\n");
        returnString.append("Genre: ")
                    .append(movieList.get(i).getGenre())
                    .append("\n");
    }

    return returnString.toString();
}

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Когда вы удаляете элементы и продолжаете перебирать один и тот же список, вы должны учитывать, как структуры данных индексируют свои элементы.

Проблема с вашим кодом заключается в том, что при удалении элемента 2 третий элемент становится вторым элементом.Потому что, когда вы удаляете элемент из списка, все последующие элементы будут сдвигаться, чтобы занять его место.Если вы попытаетесь удалить предпоследний элемент, вы получите исключение.Чтобы избавиться от этой головной боли, попробуйте повторить список в обратном порядке.

for(int i = list.size(); i >= 0; i--) {
   // do stuff here, like removing
}
0 голосов
/ 13 мая 2019

Если вы выполняете итерацию с Iterator, вы также можете просто вызвать iterator.remove(), чтобы удалить текущий элемент, и нет необходимости индексировать в список:

public void removeOddValues(List<Integer> list) {
    for (Iterator<Integer> iter = list.iterator(); iter.hasNext();) {
        Integer i = iter.next();
        if (i % 2 != 0) {
            iter.remove();
        }
    }
}

Не все структуры данных имеютитераторы, поддерживающие remove, но ArrayList и LinkedList do.

...