Java集合之List遍历找到匹配元素删除方法总结
来源:互联网 发布:部落冲突矿工升级数据 编辑:程序博客网 时间:2024/06/08 09:14
问题:在我们使用java开发的过程中可能会遇到这样的问题,删除List集合中与已知元素
相同的所有元素;
比如下面这个需求: 删除List集合中字符串为“edf”的所有记录
案例:
方案一:你可能回想到使用forEach遍历,找到匹配的将其删除
List<String> list =new ArrayList<String>(); list.add("abc"); list.add("edf"); list.add("edf"); list.add("qer"); list.add("zxc");for (String str : list) { if(str.equals("edf")) list.remove(str);//java.util.ConcurrentModificationException}for (String string : list) { System.out.println(string);}
很高兴的做完了,但是一运行报错:java.util.ConcurrentModificationException,是不是很疑惑,这是怎么回事呀?不要着急听我慢慢解释:在使用增强for循环的过程不能对元素进行删除、修改、增加的操作等操作。
但是,如果操作一下,立刻break跳出,也是不会报错的!
例如:
List<String> list =new ArrayList<String>(); list.add("abc"); list.add("edf"); list.add("edf"); list.add("qer"); list.add("zxc"); for (String str : list) { if(str.equals("edf")){ list.remove(str); break; } } for (String string : list) { System.out.println(string); }
结果输出:
abc
edf
qer
zxc
方法二:使用传统for循环遍历
List<String> list = new ArrayList<String>(); list.add("abc"); list.add("edf"); list.add("edf"); list.add("qer"); list.add("zxc"); for (int i = 0; i < list.size(); i++) { String str = list.get(i); if (str.equals("edf")) { list.remove(i); } } for (String string : list) { System.out.println(string); }
输出结果:
abc
edf
qer
zxc
你会发现,错不是会报了。但是还有一个edf没有被删除,这是怎么回事呢?
总结:你会发现如果两个元素相邻,则后面的那个元素不会被删除,原因是因为当前面
的一个元素匹配成功后,执行删除操作;删除完成,则集合后边的元素会自动前移,导致下次遍历漏掉一个元素,所以少删后面那个元素。
例如上面的案例:当遍历到第二元素的时候,if条件为true,接下来删除这个元素。此时i的值为1,但是list集合右面的元素会前移,也就是说以前的第三个元素(索引为2的元素)会到第二个元素(索引为1)的位置上。循环继续i++,i的值为2,所以成功的跳过了。
解决办法:进入判断后,i减1
List<String> list = new ArrayList<String>(); list.add("abc"); list.add("edf"); list.add("edf"); list.add("qer"); list.add("zxc"); for (int i = 0; i < list.size(); i++) { String str = list.get(i); if (str.equals("edf")) { list.remove(i); i--; } } for (String string : list) { System.out.println(string); }
结果为:
abc
qer
zxc
成功删除 !
方法三:使用api提供的方法list.iterator(),这个方法不会出现问题
List<String> list = new ArrayList<String>(); list.add("abc"); list.add("edf"); list.add("edf"); list.add("qer"); list.add("zxc"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String str = iterator.next(); if (str.equals("edf")) { iterator.remove(); } } for (String string : list) { System.out.println(string); }
结果为:
abc
qer
zxc
删除成功!
1 0
- Java集合之List遍历找到匹配元素删除方法总结
- Java集合之List遍历找到匹配元素删除方法总结
- 遍历List集合同时删除元素的正确方法
- java中循环遍历删除List和Set集合中元素的方法
- java集合框架遍历元素方法总结
- JAVA遍历List集合并删除其中的元素
- Java遍历List集合并删除其中的元素
- Java list集合通过遍历删除元素异常分析
- Java 集合List删除元素
- java list集合中元素删除方法小结
- 总结遍历List时删除元素
- 删除map、list集合元素总结
- 【Java】Java遍历删除集合中的元素
- java中List、Set、Map集合的遍历方法总结
- java中List、Set、Map集合的遍历方法总结
- java中List、Set、Map集合的遍历方法总结
- HashMap和List遍历方法总结及如何遍历删除元素
- java之遍历list集合
- redis 集群搭建及相关命令
- 07-S3C2440驱动学习(一)嵌入式linux字符设备驱动-LED字符设备驱动
- MVC属性过滤器
- fl2440移植RTC驱动及hwclock命令使用
- Java字符串数组初始化和赋值
- Java集合之List遍历找到匹配元素删除方法总结
- [BZOJ2303][Apio2011]方格染色(数学相关+加权并查集)
- 提高篇项目2-二分法解方程
- bzoj 2303: [Apio2011]方格染色 (并查集)
- Opencv error unspecified error incorrect element name operator <<
- G
- 极光推送步骤!!!
- 2017-04-28(读入问题)
- SSH中文乱码