遍历List集合,删除符合条件的元素
List集合的遍历有三种方式:增强for循环,普通for循环,Iterator迭代器遍历
如果只是对集合进行遍历,以上三种循环都可正常遍历:
(1)增强For循环遍历List集合
List<Student> stuList = new ArrayList<Student>();
for(Student stu : stuList){
System.out.println(stu.getName());
}
(2)普通For循环遍历List集合
1 List<Student> stuList = new ArrayList<Student>();
2 for(int i = 0;i<stuList.size();i++){
3 System.out.println(stuList.get(i).getName());
4 }
(3)迭代器遍历List集合
List<Student> stuList = new ArrayList<Student>();
Iterator iterator = stuList.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next().getName());
}
然而,如果我们要遍历List集合,并删除符合条件的多个元素,则只能使用Iterator迭代器,其他两种都会报错,看下面的例子
(1)增强For循环遍历List集合,并删除另外一个数组中name相同的元素
List<Student> stuList = new ArrayList<Student>();
String[] names = ["aaa","bbb","ccc"];//此处为举例子
for(Student stu : stuList){
for(String name : names){
if(stu.getName() == name){
stuList.remove(stu);//第一次删除没有问题,当删除第二个元素的时候,会报ConCurrentModificationException异常
}
}
}
(2)普通For循环遍历List集合,并删除另外一个数组中name相同的元素
List<Student> stuList = new ArrayList<Student>();
String[] names = ["aaa","bbb","ccc"];//此处为举例子
for(int i = 0;i<stuList.size();i++){
for(String name : names){
if(stuList.get(i).getName() == name){
stuList.remove(i);//第一次删除没有问题,当多个删除的时候,会出现跳过个别元素的情况,不能完全遍历
}
} }
(3)迭代器遍历List集合,并删除另外一个数组中name相同的元素
List<Student> stuList = new ArrayList<Student>();
String[] names = ["aaa","bbb","ccc"];//此处为举例子
Iterator iterator = stuList.iterator(); while(iterator.hasNext()){
Student stu = itreator.next();
for(String name : names){
if(stuList.get(i).getName() == name){
iterator.remove();//此处采用iterator本身的remove方法,可以完美解决上述问题
}
}
}
原因:增强for循环也是利用内部的iterator来遍历集合的,Iterator工作在一个独立的线程中,iterator被创建后,会建立一个单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动时,找不到迭代对象,当iterator工作时,是不允许被迭代的对象改变的,但可以被自身改变,利用Iterator的remove方法进行删除。
遍历List集合,删除符合条件的元素的更多相关文章
- 集合赋值及for循环删除符合条件的元素
一.Java语言中ArrayList对象能直接赋值给另一个ArrayList对象吗? https://zhidao.baidu.com/question/399214655.html ArrayLis ...
- C#中删除集合中符合条件的元素以及需注意属相
如果用foreach,会造成被遍历的集合更改后带来异常问题. 此时,用for循环可有效的解决这个问题. for(int i=0;i<List.Count;i++) { if(条件是真) { Li ...
- C++ vector 删除符合条件的元素
C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法. C++ 中std::remove()并不删除元素,因为容器的size()没有变化,只是元素的 ...
- 【转载】C#中List集合使用Exists方法判断是否存在符合条件的元素对象
在C#的List集合操作中,有时候需要根据条件判断List集合中是否存在符合条件的元素对象,此时就可以使用List集合的扩展方法Exists方法来实现,Exists方法的签名为bool Exists( ...
- 遍历List集合删除元素的出现报错
遍历List集合删除元素的出现报错 遍历List集合删除元素的时候会发生索引越界异常或内容遍历不全等问题. 例子: List<String> al = new ArrayList< ...
- 【转载】C#中List集合使用LastOrDefault方法查找出最后一个符合条件的元素
在C#的List集合中,FirstOrDefault方法一般用来查找List集合中第一个符合条件的对象,如果未查到则返回相应默认值.其实如果要查找最后一个符合条件的List集合元素对象,可以使用Las ...
- 【转载】 C#中通过Where方法查找出所有符合条件的元素集合
在C#的List集合对象中,FirstOrDefault方法可以用于查找List集合中符合条件的第一个元素,如果需要根据条件查找到List集合中的所有符合条件的元素对象集合,则需要使用到List集合的 ...
- 【Matlab开发】matlab删除数组中符合条件的元素与散点图绘制
[Matlab开发]matlab删除数组中符合条件的元素与散点图绘制 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ matlab删除数组中符合条件的元素 如 ...
- Foundation NSMutableArray遍历,选取出符合条件的所有对象
一.查找数组中一个元素,找到后立即返回 当遍历数组只需要返回其中一个符合条件的元素时,使用 indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, ...
随机推荐
- css毛玻璃效果
毛玻璃其实就是磨砂玻璃,能够模糊的看清背后的风景,让人感觉有种朦胧美,让界面看上去有些层次感. 比如: 高大上啊,接下来肯定是眼馋手痒的过程... 当然,用ps搞一个全景毛玻璃背景毫无疑问是最省事的, ...
- 图解DataGridView编辑列
WinForm中DataGridView功能强大,除了可以自动绑定数据源外,还可以根据需求编辑列.下面以截图说明添加编辑列的步骤(HoverTreeSCJ 项目实际界面). 1.选择DataGridV ...
- Asp.Net Core子应用由于配置中重复添加模块会引起IIS错误500.19
ASP.NET Core已经从IIS中解耦,可以作为自宿主程序运行,不再依赖IIS. 但我们还是需要强大的IIS作为前置服务器,IIS利用httpPlatformHandler模块来对后台的一些web ...
- swift变量和函数
func getNums()->(Int,Int){ //swift函数可以返回多个变量 ,) } let (a,b) = getNums() //let是常量,一旦赋值后不可改变, var是变 ...
- 错误:下列软件包有未满足的依赖关系: openssh-server : 依赖: openssh-client (= 1:7.1p1-4)
解决办法:尝试了很久才解决,这个是我发现最有用的,完美的解决了我的困难 后续过程参考:http://blog.csdn.net/jszhangyili/article/details/8881807 ...
- MySQL 相关总结
MySQL 优秀在线教程 RUNOOB-SQL 教程 MySQL 常用命令 导出操作 -- 某数据库 全部表 结构和数据 mysqldump -h192.168.8.152 -uroot -p man ...
- eclipse里打开SWT项目找不到source/design的图形UI设计界面
因为前天重新装了个新版的eclipse, 结果今天打开一个SWT的项目,突然找不到source/design的图形UI设计的两个切换按钮 我把SWT组件重新装了还是找不到.结果后来发现是因为重装ecl ...
- SpringMvc面试题
f-sm-1. 讲下SpringMvc和Struts1,Struts2的比较的优势 性能上Struts1>SpringMvc>Struts2 开发速度上SpringMvc和Struts2差 ...
- Android实现侧边栏SlidingPaneLayout
//主布局 1 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widg ...
- MongoDB学习笔记—Linux下搭建MongoDB环境
1.MongoDB简单说明 a MongoDB是由C++语言编写的一个基于分布式文件存储的开源数据库系统,它的目的在于为WEB应用提供可扩展的高性能数据存储解决方案. b MongoDB是一个介于关系 ...