使用 for 循环从列表中删除电影。 For循环工作一次然后抛出索引越界异常

Using for loop to remove movies from a list. For loop works once then throws index out of bounds exception

for 循环旨在从电影列表中删除电影。 Loop 第一次成功运行,但是一旦第二部电影被删除,For 循环就会抛出越界异常。电影列表包含 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 时,第三个元素变成了第二个元素。因为,当您从列表中删除一个元素时,所有后续元素都会移动以取代它。如果您尝试删除倒数第二个元素,您将得到异常。为了摆脱这种头痛,尝试向后迭代列表。

for(int i = list.size(); i >= 0; i--) {
   // do stuff here, like removing
}

如果你用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 的迭代器,但 ArrayListLinkedList 支持。