`
234390216
  • 浏览: 10191947 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:460716
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1771645
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1395304
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:393852
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:678174
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:529224
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1178620
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:461602
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:150073
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:66784
社区版块
存档分类
最新评论

如何正确遍历删除List中的元素,你会吗?

    博客分类:
  • java
阅读更多

 

遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题。下面主要看看以下几种遍历删除List中元素的形式:

1.通过增强的for循环删除符合条件的多个元素

2.通过增强的for循环删除符合条件的一个元素

3.通过普通的for删除删除符合条件的多个元素

4.通过Iterator进行遍历删除符合条件的多个元素

 

 

	/**
	 * 使用增强的for循环
	 * 在循环过程中从List中删除元素以后,继续循环List时会报ConcurrentModificationException
	 */
	public void listRemove() {
		List<Student> students = this.getStudents();
		for (Student stu : students) {
			if (stu.getId() == 2) 
				students.remove(stu);
		}
	}

 

 

	/**
	 * 像这种使用增强的for循环对List进行遍历删除,但删除之后马上就跳出的也不会出现异常
	 */
	public void listRemoveBreak() {
		List<Student> students = this.getStudents();
		for (Student stu : students) {
			if (stu.getId() == 2) {
				students.remove(stu);
				break;
			}
		}
	}

 

 

	/**
	 * 这种遍历有可能会遗漏某个元素,因为删除元素后List的size在
	 * 变化,元素的索引也在变化,比如你循环到第2个元素的时候你把它删了,
	 * 接下来你去访问第3个元素,实际上访问到的是原先的第4个元素。当访问的元素
	 * 索引超过了当前的List的size后还会出现数组越界的异常,当然这里不会出现这种异常,
	 * 因为这里每遍历一次都重新拿了一次当前List的size。
	 */
	public void listRemove2() {
		List<Student> students = this.getStudents();
		for (int i=0; i<students.size(); i++) {
			if (students.get(i).getId()%3 == 0) {
				Student student = students.get(i);
				students.remove(student);
			}
		}
	}

 

 

	/**
	 * 使用Iterator的方式也可以顺利删除和遍历
	 */
	public void iteratorRemove() {
		List<Student> students = this.getStudents();
		System.out.println(students);
		Iterator<Student> stuIter = students.iterator();
		while (stuIter.hasNext()) {
			Student student = stuIter.next();
			if (student.getId() % 2 == 0)
				stuIter.remove();//这里要使用Iterator的remove方法移除当前对象,如果使用List的remove方法,则同样会出现ConcurrentModificationException
		}
		System.out.println(students);
	}

 

 

附完整代码如下:

 

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListRemove {

	public static void main(String args[]) {
		ListRemove lr = new ListRemove();
		lr.listRemove();
		lr.listRemoveBreak();
//		lr.listRemove2();
//		lr.iteratorRemove();
	}

	/**
	 * 使用增强的for循环
	 * 在循环过程中从List中删除元素以后,继续循环List时会报ConcurrentModificationException
	 */
	public void listRemove() {
		List<Student> students = this.getStudents();
		for (Student stu : students) {
			if (stu.getId() == 2) 
				students.remove(stu);
		}
	}
	
	/**
	 * 像这种使用增强的for循环对List进行遍历删除,但删除之后马上就跳出的也不会出现异常
	 */
	public void listRemoveBreak() {
		List<Student> students = this.getStudents();
		for (Student stu : students) {
			if (stu.getId() == 2) {
				students.remove(stu);
				break;
			}
		}
	}
	
	/**
	 * 这种不使用增强的for循环,每次重新获取list的size遍历的情况运行时不会报错,但是可能删除的结果是错的。
	 */
	public void listRemove2() {
		List<Student> students = this.getStudents();
		for (int i=0; i<students.size(); i++) {
			if (students.get(i).getId()%2 == 0)
				students.remove(i);
		}
	}
	
	/**
	 * 使用Iterator的方式也可以顺利删除和遍历
	 */
	public void iteratorRemove() {
		List<Student> students = this.getStudents();
		System.out.println(students);
		Iterator<Student> stuIter = students.iterator();
		while (stuIter.hasNext()) {
			Student student = stuIter.next();
			if (student.getId() % 2 == 0)
				stuIter.remove();
		}
		System.out.println(students);
	}
	
	private List<Student> getStudents() {
		List<Student> students = new ArrayList<Student>() {
			{
				int i = 0;
				while (i++ < 10) {
					Student student = new Student(i, "201200" + i, "name_" + i);
					this.add(student);
				}
			}
		};
		return students;
	}
}

 

 

public class Student {

	private int id;
	private String stuNo;
	private String name;
	
	public Student() {
		
	}
	
	public Student(int id, String stuNo, String name) {
		this.id = id;
		this.stuNo = stuNo;
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getStuNo() {
		return stuNo;
	}

	public void setStuNo(String stuNo) {
		this.stuNo = stuNo;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", stuNo=" + stuNo
				+ "]";
	}
	
}
6
1
分享到:
评论
9 楼 234390216 2017-06-29  
海云台119 写道
getSize()获取实时的大小,按照上面的业务逻辑是会删掉错误的数据,其他业务情景,有些数据没有检测到,导致没有效果

看代码注释说明,博主没说这种情况可以正确删除。
8 楼 海云台119 2017-06-26  
getSize()获取实时的大小,按照上面的业务逻辑是会删掉错误的数据,其他业务情景,有些数据没有检测到,导致没有效果
7 楼 静静是小花 2016-10-11  
6 楼 SureForYou 2016-04-22  
                         
5 楼 yunkun666 2015-09-06  
//这种应该更好吧
public static Object returnDate(List<String> list){
List<String> list1 = new ArrayList<String>();
for(String lt:list){
if(lt.equals("myk")){//你的判断条件
}else{
list1.add(lt);
}
} return list1;
}
4 楼 netwelfare 2015-04-18  
文章讲解的不错,ArrayList在遍历的同时如果去删除或者增加元素,很容易出现问题的,从网上看到一篇文章,讲解的也不错,推荐一下:ArrayList循环遍历并删除元素的常见陷阱
3 楼 bit1129 2014-09-22  
CopyOnWrite就是解决迭代过程中的修改问题的
2 楼 234390216 2012-05-29  
junlinux 写道
我现在遇到这个问题了,上面的方法我都试了,我想问一下,这样的情况什么解决方法比较好呢?目前我使用的时Iterator方式。

iterator方式比较好
1 楼 junlinux 2012-05-27  
我现在遇到这个问题了,上面的方法我都试了,我想问一下,这样的情况什么解决方法比较好呢?目前我使用的时Iterator方式。

相关推荐

    正确遍历删除List中的元素方法(推荐)

    下面小编就为大家带来一篇正确遍历删除List中的元素方法(推荐)。小编觉得挺不错的,在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Python中list循环遍历删除数据的正确方法

    前言 初学Python,遇到过这样的问题,在遍历list的时候,删除符合条件的数据,可是总是报异常,代码如下: ...原因是在删除list中的元素后,list的实际长度变小了,但是循环次数没有减少,依然按照

    对python list 遍历删除的正确方法详解

    在遍历list的时候,删除符合...原因是在删除list中的元素后,list的实际长度变小了,但是循环次数没有减少,依然按照原来list的长度进行遍历,所以会造成索引溢出。 解决方案:倒序循环删除 num_list = [1, 2, 3, 4,

    解决Python 遍历字典时删除元素报异常的问题

    错误的代码① d = {'a':1, 'b':0, 'c':1, 'd':0} for key, val in d.items(): del(d[k]) 错误的代码② — 对于Python3 d = {'a':1, 'b':0, 'c':1, 'd':0} ...以上这篇解决Python 遍历字典时删除元素报异常的问

    python_interview_question:关于python的面试题

    13.请写出一段python代码实现删除list里面的重复元素?14.给定两个list A,B ,请用找出A,B中相同与不同的元素企业面试题15.python新式类和经典类的区别?16.python中内置的数据结构有几种?17.python如何实现单例...

    关于STL的erase()陷阱-迭代器失效问题的总结

    下面材料整理自Internet&...在使用 list、set 或 map遍历删除某些元素时可以这样使用: 1.1 正确写法1 std::list&lt; int&gt; List; std::list&lt; int&gt;::iterator itList; for( itList = List.begin(); itList != List.end();

    JAVA面试题最全集

    数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? 要掌握Collection相关的接口和类的使用 56.使用StringBuffer类与String类进行字符串连接时有何区别? 57.调用Thread类的...

    net学习笔记及其他代码应用

    28.SQLSERVER服务器中,给定表 table1 中有两个字段 ID、LastUpdateDate,ID表示更新的事务号, LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号 答:Select ID FROM table1 Where ...

    java 面试题 总结

    栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。 堆是栈的一个组成元素 19、forward 和redirect的区别 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL...

    flex3的cookbook书籍完整版dpf(包含目录)

    在State Changes事件中添加和删除事件监听器 11.11节. 添加视图States到Flash组件 11.12节. 处理StateChange 事件 11.13节. 动态生成States和Transitions 11.14节. 创建State的自定义动作(action) 第十二章. 特效...

    超级有影响力霸气的Java面试题大全文档

     栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。 堆是栈的一个组成元素 22、forward 和redirect的区别  forward是服务器请求资源,服务器直接访问目标地址的URL,把...

    用c描述的数据结构演示软件

    在演示算法之前,需先在弹出的小窗口中输入线性表的数据元素及算法参数 i(插入或删除的位置)和 b(被插的数据元素)的值。顺序表的图示窗口在演示屏的上方,链表的图示窗口在左侧。 2. 有序表的操作 算法演示屏的...

    数据结构演示软件

    在演示算法之前,需先在弹出的小窗口中输入线性表的数据元素及算法参数 i(插入或删除的位置)和 b(被插的数据元素)的值。顺序表的图示窗口在演示屏的上方,链表的图示窗口在左侧。 2. 有序表的操作 算法演示屏...

    Python Cookbook

    12.6 从XML DOM节点的子树中删除仅有空白符的文本节点 451 12.7 解析Microsoft Excel的XML 452 12.8 验证XML文档 454 12.9 过滤属于指定命名空间的元素和属性 455 12.10 用SAX合并连续的文本事件 458 12.11 ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    9.2.1 遍历String中的字符 220 9.2.2 获取字符串中的一部分 222 9.2.3 判断两个字符串是否相等 223 9.2.4 判断字符串的开头和结尾 225 9.2.5 分割字符串 225 9.2.6 在字符串中查找子字符串或字符 226 9.2.7 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    9.2.1 遍历String中的字符 220 9.2.2 获取字符串中的一部分 222 9.2.3 判断两个字符串是否相等 223 9.2.4 判断字符串的开头和结尾 225 9.2.5 分割字符串 225 9.2.6 在字符串中查找子字符串或字符 226 9.2.7 ...

Global site tag (gtag.js) - Google Analytics