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

如何正确遍历删除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方式。

相关推荐

    C#遍历List并删除某个元素的方法

    当我们需要遍历List并根据条件删除特定元素时,需要注意正确的方法,以避免在遍历过程中出现错误。以下将详细介绍如何在C#中遍历List并删除元素,包括正序和倒序遍历的技巧。 首先,我们来看一下错误的遍历方式。...

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

    以下是几种常见的遍历删除List元素的方法及其注意事项: 1. **通过增强的for循环删除元素** - **问题**:在增强的for循环(foreach)中直接删除元素会导致`ConcurrentModificationException`,因为这种方式不允许...

    C++ STL list 遍历删除出错解决方案

    本篇文章主要探讨的是在使用STL list时遇到的遍历删除元素过程中常见的错误及其解决方案。 错误用法通常出现在尝试同时遍历和删除list中的元素时。以下是三种常见的错误做法: 1. 错误用法一: 在这个例子中,迭代...

    HashMap和List遍历方法及如何遍历删除元素总结

    HashMap和List遍历方法及如何遍历删除元素总结 HashMap和List都是Java中最常用的数据结构,它们都可以用来存储和操作数据。然而,在遍历和删除元素时,需要小心地处理,以免出现问题。下面总结了HashMap和List的...

    java中循环遍历删除List和Set集合中元素的方法(推荐)

    在Java编程中,遍历并删除集合(如List或Set)中的元素是一项常见的操作,但如果不正确地执行,可能会导致`ConcurrentModificationException`异常。这个异常通常在尝试修改正在迭代的集合时出现,因为Java的集合迭代...

    C#在foreach遍历删除集合中元素的三种实现方法

    C#中,foreach遍历删除集合中元素是很常见的操作,但是删除元素时,集合的大小和元素索引值会发生变化,从而导致在foreach中删除元素时会抛出异常。下面我们将介绍三种实现方法,帮助大家更好地理解和使用C#。 方法...

    Iterator遍历过程中list删除导致异常

    当你想在迭代过程中删除元素时,应该使用`Iterator`的`remove()`方法,而不是直接调用集合的`remove()`方法。这样,`Iterator`会正确处理集合的内部状态,避免异常: ```java List&lt;String&gt; list = new ArrayList...

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

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

    Java如何在List或Map遍历过程中删除元素

    在Java编程中,遍历并删除List或Map中的元素是一个常见的任务,但如果不理解其内部机制,可能会导致一些未预期的问题。本文将深入探讨在Java中如何安全地在List和Map遍历过程中删除元素。 首先,我们来看List的遍历...

    66丨迭代器模式(中):遍历集合的同时,为什么不能增删集合元素?1

    为了解决这个问题,Java中的`List`接口提供了`remove()`方法的另一种版本——`Iterator.remove()`,这个方法可以安全地在遍历过程中删除当前元素。这是因为迭代器在调用`remove()`时,会更新自身的状态以反映元素已...

    【Java面试题】List如何一边遍历,一边删除?

    在Java编程中,遍历并删除List集合是一个常见的操作,但在实际编程中,如果不使用正确的方法,可能会导致`java.util.ConcurrentModificationException`异常。本文主要针对这个面试题,详细讲解如何在遍历List的同时...

    解决JAVA遍历List集合,删除数据时出现的问题

    在遍历List集合时,我们可以使用for循环来删除元素,但是我们需要注意的是,在删除元素后,我们需要将迭代变量i的值减1,以便在下一次迭代中处理正确的元素。 解决方法2:先删除后面的元素 另一种解决方法是,先...

    完美解决python遍历删除字典里值为空的元素报错问题

    #### 三、正确的遍历删除方法 **3.1 使用临时列表存储待删除的键** **步骤说明:** 1. **创建临时列表**:首先获取字典的所有键,并将其转换为列表形式。 2. **遍历键列表**:在遍历过程中检查每个键对应的值是否...

    C#集合遍历时删除和增加元素的方法

    总结起来,处理C#集合遍历过程中的元素修改,特别是删除和增加操作,需要使用支持在遍历中修改的集合类型,如`LinkedList&lt;T&gt;`,并且在操作过程中需要特别注意元素引用的更新,以避免数据丢失或遍历错误。在实际编程...

    java-遍历map

    - 在遍历`Map`时,如果在遍历过程中尝试修改`Map`(例如添加或删除元素),可能会引发`ConcurrentModificationException`异常。因此,在遍历的同时不要修改`Map`。 - 使用流API遍历时,虽然代码更简洁,但性能上可能...

    C#遍历集合与移除元素的方法

    然而,当在遍历过程中需要修改集合(如移除元素)时,`foreach`循环可能会导致`Collection was modified; enumeration operation may not execute.`的异常。这是因为`foreach`内部使用的是迭代器,而迭代器不支持在...

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

    初学者往往会直接在遍历过程中使用.pop()方法删除元素,这通常会导致程序报错,例如“IndexError: list index out of range”。原因是删除元素后,列表的长度发生了改变,但是循环次数没有相应减少,导致索引与列表...

    python列表的逆序遍历实现

    例如,在一个包含数字的列表中,如果我们要删除所有包含数字"2"的元素,直接正向遍历并使用`remove()`函数会遇到问题,因为删除元素会导致后续元素的下标发生变化,使得某些元素在遍历过程中被遗漏。 错误的正向...

Global site tag (gtag.js) - Google Analytics