java中ArrayList的遍历删除元素(一)
有如下需求,例如:
有如下一个ArrayList,需要删除其中字符串有 "2" 的元素
博主最开始学习java开发时,最先接触到的是简单for循环,所以最开始实现以上需求的编码为:
但是,得到的结果却为:
问题产生:
明显,上面集合遍历删除元素的方法并不正确,以至于元素 "2-1" 并未删除掉;
那么,造成如上结果的原因是啥呢?博主为了方便理解,画了如下一张图:
从上图可以看出,删除了第一个满足条件的元素时,i 对应的集合下标为 2;
这个时候删掉元素 "1-2" 后,list中元素下标为2的元素变为了 "2-1";
for循环接着往下走,i变成了3,再次获得的元素为下标是 3 的元素,即 "3" ;就会导致元素 "2-1" 被漏掉,从而得到上述结果
解决方法:
从上述步骤看,问题出在,删掉下标为2的元素之后,后续元素下标都会减1,导致循环再次执行时,会略掉删除元素后下标为2(删除前下标为3)的元素;
那么可以在元素删除成功后,将 i-1 即可
代码以及结果如下:
方法拓展:
除了以上方法,使用简单for循环的倒序删除也可以解决上述问题,代码如下:
为何倒序删除不会产生上述问题呢?让我们再看一张图
从上图可以看出,由于是倒序循环,会先删除元素 "2-1";
这个时候,下标产生变化的元素为元素"2-1"之后的元素,其之后的元素在前序步骤就已遍历过,所以不会对元素"2-1"之前的(未遍历的)元素产生影响