前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >list.remove()时出问题,集合的remove方法注意事项1

list.remove()时出问题,集合的remove方法注意事项1

作者头像
IT云清
发布2019-01-22 10:18:11
1K0
发布2019-01-22 10:18:11
举报
文章被收录于专栏:IT云清

集合有一个方法叫remove(index),这是用来移除集合元素的,但是使用的时候,会有一个问题,很多人不注意这个问题,会发现使用完这个方法后,数据对不上了。看下面的小案例:

请移除list集合中含有"a"的字符串。如下:

代码语言:javascript
复制
public static void main(String[] args) {
		//建立一个list集合,里面有5个元素含有“a”,3个不含有“a”
		List<String> list = 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--;

代码语言:javascript
复制
//遍历集合,移除含有“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   

此问题,还可以有第二种方法处理,倒着遍历:

关键部分代码如下:

代码语言:javascript
复制
for(int j = list.size()-1;j >= 0;j-- ){
			String str = (String)list.get(j);
			if(str.contains("a")){
				list.remove(j);
			}
			
		}

这样也可以避免这个问题。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年09月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档