Java集合如何遍历删除指定元素
目录
1、删除List
2、删除Set
3、删除Map
注意事项:
1、删除List
public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");list.add("赵六");list.forEach(System.out::println);for(String str : list) {if ("李四".equals(str)) {list.remove(str);}}list.forEach(s -> {System.out.println("第1次删除后:" + list);});}
}
以上代码运行会发生并发修改异常ConcurrentModificationException,正确的方式是:
public class ListExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");list.add("赵六");System.out.println(list);// 方法1:迭代器遍历Iterator<String> iterator = list.iterator();while(iterator.hasNext()) {String s = iterator.next();if ("李四".equals(s)) {iterator.remove();}}System.out.println("第1次删除后:" + list);// 方法2:使用集合的removeIf()方法list.removeIf(new Predicate<String>() {@Overridepublic boolean test(String s) {return "王五".equals(s);}});System.out.println("第2次删除后:" + list);}
}
2、删除Set
同样,Set也不能通过foreach删除,否则发生异常
public class SetExample {public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("张三");set.add("李四");set.add("王五");System.out.println(set);// 此处会发生并发修改异常for(String str : set) {if ("张三".equals(str)) {set.remove(str);}}System.out.println("第1次删除后:" + set);set.removeIf("李四"::equals);System.out.println("第2次删除后:" + set);}
}
3、删除Map
public static void main(String[] args) {Map<Integer, String> map = new HashMap();map.put(1, "张三");map.put(2, "李四");map.put(3, "王五");map.put(4, "赵六");map.forEach((k, v) -> System.out.println(k + "," + v));Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator();while(iterator.hasNext()) {Map.Entry<Integer, String> entry = iterator.next();Integer key = entry.getKey();if (key == 1) {iterator.remove();}}System.out.println(map);
}
注意事项:
使用普通for循环删除list里面的元素会有bug,当删除一个元素时,list的长度会减1,被删除元素的后一个元素会向前移动,导致只删了一部分符合条件的元素。
public class ListExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("张三");list.add("李四");list.add("王五");list.add("赵六");System.out.println("删除前:" + list);for (int i = 0; i < list.size(); i++) {String s = list.get(i);if ("张三".equals(s)) {list.remove(s);}}System.out.println("删除后:" + list);}}
以上代码的运行结果为:
删除前:[张三, 张三, 李四, 王五, 赵六]
删除后:[张三, 李四, 王五, 赵六]
原因是:
第一轮循环,i = 0,会删除第一个张三,删除之后只剩四个元素[张三, 李四, 王五, 赵六]
第二轮循环,i = 1,从第二个元素(也就是“李四”)开始判断
以上代码可以简单的改成如下,每次都比较第一个元素
public class ListExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("张三");list.add("李四");list.add("王五");list.add("赵六");System.out.println("删除前:" + list);for (int i = 0; i < list.size(); i++) {String s = list.get(0);if ("张三".equals(s)) {list.remove(s);}}System.out.println("删除后:" + list);}}
事实上Collection的removeIf()方法的实现也是通过Iterator的romove()方法删除元素,源码如下:
default boolean removeIf(Predicate<? super E> filter) {Objects.requireNonNull(filter);boolean removed = false;final Iterator<E> each = iterator();while (each.hasNext()) {if (filter.test(each.next())) {each.remove();removed = true;}}return removed; }
答疑环节:
那有童鞋就要问了,foreach遍历删除会发生异常,为什么普通for循环就能正常运行呢?
因为foreach也会被编译成迭代器遍历的方式,只不过调用的是集合的remove()方法,没有调用迭代器的remove()导致的异常。
foreach编译前:
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("张三");list.add("李四");list.add("王五");list.add("赵六");System.out.println("删除前:" + list);for (String s : list) {if ("张三".equals(s)) {list.remove(s);}}System.out.println("删除后:" + list);}
foreach编译后:
public static void main(String[] args) {List<String> list = new ArrayList();list.add("张三");list.add("张三");list.add("李四");list.add("王五");list.add("赵六");System.out.println("删除前:" + list);Iterator var2 = list.iterator();while(var2.hasNext()) {String s = (String)var2.next();if ("张三".equals(s)) {list.remove(s);}}System.out.println("删除后:" + list); }
如果还想更深入了解为什么会发生异常,可以参考文章Java集合的快速失败原则
文章总结:
使用迭代器的remove()方法删除就可以了
Java集合如何遍历删除指定元素相关推荐
- java集合的遍历删除
java集合的遍历删除. 案例 使用普通for循环遍历集合 //以下代码不会有任何问题List<Integer> list = new ArrayList();list.add(1);li ...
- Java基础361问第4问——List如何遍历删除指定元素
这道题是面百度时的一个问题,也是一道很经典的题目 给定一个整数集合{1,2,2,3,4},删除其中能够被2整除的元素(即最后集合变为{1,3}) 看到这个问题,我开始觉得很简单 for (int i ...
- Java 集合中遍历删除元素抛异常的原因,从ArrayList说起
文章目录 使用for删除遗漏元素的原因: 使用foreach删除报错的原因: 其它集合的删除方法 删除集合元素的工具类 ArrayList删除元素的方式. 使用for循环删除.会遗漏删除的元素 使用f ...
- Java 集合List遍历删除
循环遍历需要从最后索引开始!!! public static void main(String[] args) {List<Integer> list = new ArrayList< ...
- Java 集合List、Set、HashMap操作二(Map遍历、List反向、Set删除指定元素,集合只读、TreeMap操作、List转Array、List移动元素)
Map遍历 import java.util.Map; import java.util.HashMap; import java.util.HashSet; import java.util.Ite ...
- java list移除符合条件的元素_java List删除指定元素的三种方法
java List删除指定元素有3种方法,分别是普通for循环,增强for循环以及原生的Iterator迭代器循环来删除list中指定的某个元素,非常的简单. 1:普通for循环遍历list,并删除指 ...
- java中List遍历删除元素
删除末尾几个元素 import java.util.LinkedList; import java.util.List;public class TestList {public static voi ...
- 从List集合中删除指定元素
从List集合中删除指定元素的几种方式 最近在使用这个操作的时候搜索了一下网上的文章,发现有些能用有些不能用, 由于使用之前没有做详细的测试,导致程序bug,今天抽空做了一下总结和测试. packag ...
- Redis中有序集合zset数据类型(增加(添加元素)、获取(获取指定范围元素、返回权值在min和max之间的成员、返回成员member的score值)、删除(删除指定元素和指定权值范围的元素))
sorted set,有序集合 元素为string类型 元素具有唯⼀性,不重复 [值不能重复] 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序 说明:没有修 ...
最新文章
- Numpy入门教程:10. 统计相关
- FAST选址与三维仿真模拟研究
- 集大通100%任务完成度签到
- .NET Core IdentityServer4实战 第二章-OpenID Connect添加用户认证
- 创业公司,没有好领导,有多少人才都是死路一条
- python脚本在linux上运行的两种方式_python脚本当作Linux中的服务启动实现方法
- 数仓出现“wait in ccn queue”的时候,怎么迅速定位处理?
- 【算法】弗洛伊德算法 最短路径算法
- gperftools
- 手把手带你了解安卓Unity3D手游
- C程序设计--VC++6.0的使用(常用快捷键)
- 笨笨-歌词伴侣V1.2(酷狗KRC转LRC,LRC歌词批量下载)
- Python数据字典处理Excel,并统计总数,画出饼图
- 小米 信号测试软件,小米WiFi测试版
- 从高中编码员到国际技术演讲者— Arun Michael Dsouza访谈
- 学习云计算有什么用处 该怎么学好云计算技术
- 全自动爬虫,你爱了么
- 利用selenium库实现QQ空间点赞
- 华为优招面经(已拿offer)
- 9个offer,12家公司
热门文章
- 移动应用表单设计秘籍
- DM数据库网络通信异常排查
- java fileinputstream转换字节流_FileInputStream输入字节流
- 常用的函数式接口--Consumer接口
- 20060627: “感冒通”今何在
- 解决 VS 出现错误 MSB3644 找不到 .NETFramework,Version=v4.6.1 的引用程序集。要解决此问题,请为此框架版本安装......
- 酷睿i9“出山大典”之后,游戏玩家与内容创作用户都笑了……
- 如何在线录制视频?教您一个简单的方法!
- 二维,三维坐标旋转,左右手坐标系
- 倪文迪陪你学蓝桥杯2021寒假每日一题:1.26日(2019省赛A组第4题)