遍历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, ...
随机推荐
- Levenshtein Distance算法(编辑距离算法)
编辑距离 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符, ...
- android Can't bind to local 86XX for debugger
For some reason eclipse DDMS always gives the error 'Can't bind to local 86XX for debugger' every ti ...
- nodejs:连接数据库SqlServer,mssql模块
现在的数据库越来越多,如mgdb,我比较常用的是mysql,但有一天做项目需要连接SqlServer,就去找了个方法.找了很多无非就mssql模块和node-sqlserver模块,但node-sql ...
- Visual Studio中UnitTesting单元测试模板代码生成
在软件研发过程中,单元测试的重要性直接影响软件质量.经验表明一个尽责的单元测试方法将会在软件开发的某个阶段发现很多的Bug,并且修改它们的成本也很低.在软件开发的后期阶段,Bug的发 ...
- SSH整合之全注解
SSH整合之全注解 使用注解配置,需要我们额外引入以下jar包
- jquery给div的innerHTML赋值
$("#id").html()=""; //或者 $("#id").html("test");
- 基于mybatis-generator-core 1.3.5项目的修订版以及源码剖析
项目简单说明 mybatis-generator,是根据数据库表.字段反向生成实体类等代码文件.我在国庆时候,没事剖析了mybatis-generator-core源码,写了相当详细的中文注释,可以去 ...
- UITabBarController 更改tabbariteam上的选中图片
首先遵守“ UITabBarControllerDelegate ”协议 再在- (void)viewDidLoad {}方法中设置代理“ self.tabBarController.delegate ...
- iOS tableViewCell自适应高度 第三发类库
在github中有许多大牛封装好的第三发类库,其中有个自适应cell高度的类库 下载地址:https://github.com/gsdios/SDAutoLayout model类 commentsM ...
- 解决 安装cocoapods失败,提示 requires Ruby version >=2.2.2
步骤如下: rvm install ruby-2.2 但是,但是竟然报错了,具体我忘记额,但是是权限和brew的问题,那么我又转向修复brew: // 清理原来brew rm -rf /usr/loc ...