如果你刚接触Java,当你想删除List中的某些元素时,你可能会这么写:
for (int i = 0;i < List.size();i++) {
if (List.get(i)满足删除的条件) {
List.remove(i);
}
}
但当你遍历检查List中的元素时,你会发现有些满足删除条件的元素并没有被删除。这是为什么呢?原因在于List调用了remove(i)方法后,会移除当前索引为i的位置上的元素,该位置之后的元素就全部依次左移1位,即原来索引为i+1的元素移动到索引为i的位置上;此时你的循环控制变量i就指向了之前索引为i+1的元素,由于检查和删除操作已被执行,该元素不会被if语句检查;当i下一次自增1时,循环就越过了该元素检查其之后的元素。如果你想要删除的元素在List中是连续分布的,就会出现有部分元素没有被删除的情况。
有几种方法可以避免这种错误:
方法一
在正序遍历List删除元素时,手动修正索引i
for (int i = 0;i < List.size();i++) {
if (List.get(i)满足删除的条件) {
List.remove(i);
i--;
}
}
方法二
倒序遍历List删除元素
for (int i = List.size() - 1;i >= 0;i--) {
if (List.get(i)满足删除的条件) {
List.remove(i);
}
}
方法三
使用迭代器Iterator遍历List删除元素
Iterator<元素类型> iterator = List.iterator();
while (iterator.hasNext()) {
元素类型 item = iterator.next();
if (item满足删除的条件) {
iterator.remove();
}
}