本文共 1417 字,大约阅读时间需要 4 分钟。
集合有一个方法叫remove(index),这是用来移除集合元素的,但是使用的时候,会有一个问题,很多人不注意这个问题,会发现使用完这个方法后,数据对不上了。看下面的小案例:
请移除list集合中含有"a"的字符串。如下:
public static void main(String[] args) { //建立一个list集合,里面有5个元素含有“a”,3个不含有“a” Listlist = new ArrayList<>(); list.add("abc"); list.add("anc"); list.add("amg"); list.add("agf"); list.add("omg"); list.add("aig"); list.add("gme"); list.add("wbe"); //遍历集合,移除含有“a”的元素 for(int i = 0; i < list.size();i++){ String str = list.get(i); if(str.contains("a")){ list.remove(i); } } //打印,看结果 for (Object st : list) { System.out.print(st+" "); } }
这个过程看上去毫无问题,理论上,打印的结果应该是:
omg gme wbe
因为含有a的都移除了,所以剩下三个不含有a的。
实际打印结果:
anc agf omg gme wbe
发现,竟然还有两个元素里面含有“a”,发生了什么?看上去在遍历时的处理逻辑是没有问题的啊。
究竟是什么原因呢?
在list集合遍历的时候,每一次循环,指针都会向后移动一位(理解为i从0开始,每次都会后移一位),
但是,如果有元素被删除了,那后面的所有元素都会顺次向前移动一位(0索引的元素没了,那后面的就会补过来啊),
如下表:
指针一直在向后跑,当有元素移除,后面的集体前移时,就恰好会有漏网之鱼,指针没有指向过它,图上红色的,就漏掉了。
那么,这个问题,怎么处理呢?
很简单,当有元素被移除时,我们把指针前移一位,弥补一下这个偏差,就不会有漏掉的了,代码如下:
仅仅就是加了一句: i--;
//遍历集合,移除含有“a”的元素 for(int i = 0; i < list.size();i++){ String str = list.get(i); if(str.contains("a")){ list.remove(i); i--; } }此时,再看一下指针移动和每次操作的过程:
由于每次有元素被删除时,强行把指针回退一位,那么漏网之鱼就会被指针扫过,判断有a,直接移除。
(注意i--的位置,当没有移除元素时,指针是没有强制回退的)
此时,执行代码,结果为:
omg gme wbe
此问题,还可以有第二种方法处理,倒着遍历:
关键部分代码如下:
for(int j = list.size()-1;j >= 0;j-- ){ String str = (String)list.get(j); if(str.contains("a")){ list.remove(j); } }这样也可以避免这个问题。
转载地址:https://it4all.blog.csdn.net/article/details/77915981 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!