📅  最后修改于: 2023-12-03 15:07:39.361000             🧑  作者: Mango
删除 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 来保存需要删除的元素,然后再从原数组中删除。