📜  在 for 循环中删除 arraylist 索引 (1)

📅  最后修改于: 2023-12-03 15:07:39.361000             🧑  作者: Mango

在 for 循环中删除 ArrayList 索引

删除 ArrayList 中的元素是Java编程中经常会遇到的任务。但是在循环中删除元素是比较棘手的,因为在循环过程中删除元素会导致 ArrayList 的大小发生变化,索引也会变化,可能会出现漏删或重删的情况。本文介绍了如何在 for 循环中安全地删除 ArrayList 索引。

错误示范

以下是一种错误的删除元素的方式:

ArrayList<String> list = new ArrayList<String>();
// 为 list 添加元素
for (int i = 0; i < list.size(); i++) {
    if (list.get(i).equals("要删除的元素")) {
        list.remove(i);
    }
}

此方法的问题在于,当删除一个元素之后,数组的大小会减少1,而循环指针 i 仍旧自加1. 这样,当 i 指向最后一个元素进行删除时,假设删除了该元素,那么此时 size() 的大小会是原来的长度减1,也就是为数组的长度。接下来,循环指针 i 又会增加1 ,但是此时 i 已经越界,会抛出一个 IndexOutOfBoundsException 异常,并且漏删掉最后一个元素。

正确的方法

正确的方式是,使用 Iterator 来遍历数组并删除元素。

ArrayList<String> list = new ArrayList<String>();
// 为 list 添加元素
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String str = iterator.next();
    if (str.equals("要删除的元素")) {
        iterator.remove();
    }
}

这种方式通过使用 Iterator 来进行从集合中删除元素的操作,并且避免了在循环中断开元素的问题。

另一种正确的方法

另一种方法也是常用的方法是,将要删除的元素添加到一个临时的 ArrayList 中,循环结束后再进行删除,如下所示:

ArrayList<String> list = new ArrayList<String>();
ArrayList<String> toBeDeleted = new ArrayList<String>();
for (String str : list) {
    if (str.equals("要删除的元素")) {
        toBeDeleted.add(str);
    }
}
list.removeAll(toBeDeleted);

其中 toBeDeleted 用来保存需要删除的元素,循环结束后再通过 removeAll(toBeDeleted) 方法从原数组中删除。需要注意的是,在调用 removeAll() 方法之后,原数组的大小和索引都会发生变化。

结论

在循环中删除 ArrayList 中的元素是一项常见的任务,但是需要特别注意,不要在循环中断开数组。可以使用迭代器来避免这个问题,并安全删除元素。如果需要在循环结束后再删除元素,那么可以利用一个临时的 ArrayList 来保存需要删除的元素,然后再从原数组中删除。