`

Iterarot迭代删除

 
阅读更多

Java集合一般调用删除方法都是集合的方法,例如:

List list = new ArrayList();

list.add(...);

list.remove(...);

但是,如果在循环的过程中调用集合的remove()方法,一般就会导致循环出错,例如:

for(int i=0;i<list.size();i++){    

         list.remove(...);

}

循环过程中list.size()的大小变化了,就导致了错误。这时会抛出异常ConcurrentModificationException().

 

所以,如果你想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态.

今天发现一个现象。

   List <String>  list=new ArrayList<String>();
	    list.add("11");
	    list.add("22");
	    list.add("33");
	    for(Iterator iter=list.iterator();iter.hasNext();){
	    	//迭代器循环过程中,调用迭代器的remove方法。不能直接调用list的remove
	    	 String st=(String)iter.next();
	    	 if(st.equals("22")){
	    	     list.remove(st);//List的remove方法
	    		// iter.remove();//Iterator的remove方法
	    	 }
	    }

 

 

 正常情况下,我们会调用Iterator的remove方法,但是我进行了个尝试,这段代码你用list的remove()方法d.remove(st),当st为11,33时都会抛异常,但是当它为22时,不会抛异常.非常不解。接着试了几次后发现,在一个list中,只有删除倒数第二个元素时是正常的,删除其它位置都会有异常抛出。于是我翻看了AbstractList中的迭代实现.

	/**
	 * The modCount value that the iterator believes that the backing
	 * List should have.  If this expectation is violated, the iterator
	 * has detected concurrent modification.
	 */
	int expectedModCount = modCount;

	public boolean hasNext() {
            return cursor != size();
	}

	public E next() {
            checkForComodification();
	    try {
		E next = get(cursor);
		lastRet = cursor++;
		return next;
	    } catch (IndexOutOfBoundsException e) {
		checkForComodification();
		throw new NoSuchElementException();
	    }
	}

	public void remove() {
	    if (lastRet == -1)
		throw new IllegalStateException();
            checkForComodification();

	    try {
		AbstractList.this.remove(lastRet);
		if (lastRet < cursor)
		    cursor--;
		lastRet = -1;
		expectedModCount = modCount;
	    } catch (IndexOutOfBoundsException e) {
		throw new ConcurrentModificationException();
	    }
	}

	final void checkForComodification() {
	    if (modCount != expectedModCount)
		throw new ConcurrentModificationException();
	}
    }

 

 

 

 

  cursor标示着当前list的索引,不断地与list size比对。如果hasNext返回true,会紧接着执行next方法,在next方法中检查当前list有没有被修改过。 
    在list迭代过程中,如果删除一个元素,那么size就减一,hasNext提前结束,迭代不会到达list的最后一个元素。也就是说,如果在迭代到list倒数第二个元素时删除此元素,接下来的hasNext会返回false,迭代结束,不会进入next方法中做检查,也就不会出什么问题。而除此之外的其它情况下,hasNext都是true,接下来的next方法检查时会产生异常。

 

   

分享到:
评论

相关推荐

    Jacobi迭代算法_jacobi迭代_Jacobi迭代法_SOR迭代法_Gauss-Seidel迭代法_迭代法_

    在本主题中,我们将详细探讨Jacobi迭代法、Gauss-Seidel迭代法以及SOR(Successive Over-Relaxation)迭代法这三种常见的迭代算法,并结合MATLAB语言进行实现。 1. Jacobi迭代法: Jacobi迭代法是由德国数学家Carl...

    雅克比迭代+高斯迭代+SOR迭代法Matlab程序

    本主题涉及三种迭代方法:雅克比迭代、高斯迭代以及松弛法(SOR)迭代,并提供了相应的Matlab程序实现。这些方法广泛应用于科学计算、工程问题和数据分析中。 首先,雅克比迭代(Jacobi Iteration)是一种基于矩阵...

    数值分析雅可比迭代高斯迭代法实验报告.doc

    在数值分析领域,雅可比迭代(Jacobi Iteration)和高斯-塞德尔迭代(Gauss-Seidel Iteration)是两种广泛用于求解大型线性方程组的方法。这两种迭代法都基于矩阵分解和迭代更新的思想,适用于处理稀疏矩阵问题,...

    MATLAB实现Jacobi 迭代法,Gauss-Seidel 迭代法,逐次超松弛迭代法,共轭梯度法

    求解线性⽅方程组 Ax=b,其中 A 为 ...比较 Jacobi 迭代法、Gauss-Seidel 迭代法、逐次超松弛迭代法、 共轭梯度法与高斯消去法、列主元消去法的计算时间。改变逐次超松弛迭代法的松弛因⼦, 分析其对收敛速度的影响。

    MATLAB迭代法收敛判断

    在数值分析领域,迭代法是一种求解线性方程组的有效方法。在MATLAB中,我们可以利用编程实现这些算法,以便于理解和应用。本主题主要关注三种迭代法:雅可比迭代、高斯-赛德尔迭代以及松弛法迭代,并探讨它们的收敛...

    迭代学习Simulink仿真

    迭代学习控制(Iterative Learning Control, ILC)是一种在重复任务中通过不断学习和改进来提升系统性能的控制策略。在Simulink中实现ILC仿真,可以帮助我们理解和优化那些在时间序列上具有周期性或者重复性的过程。...

    jor_dor_jor_迭代法_JOR迭代_JOR迭代法_源码

    JOR迭代法,全称为"Jacobi-Overrelaxation"迭代法,是数值线性代数领域中解决大型稀疏线性系统的一种有效方法。它是在经典的Jacobi迭代法基础上进行改进,通过引入松弛因子(通常记为w)来加速收敛过程。在Jacobi...

    Matlab实现Gauss迭代法,SOR迭代法.zip

    在数值计算领域,Gauss迭代法和SOR(Successive Over-Relaxation)迭代法是求解线性方程组的两种重要算法。Matlab作为一款强大的数学计算软件,提供了便利的环境来实现这些方法。这里我们将深入探讨这两种迭代法及其...

    解线性方程组的迭代法_Matlab解线性方程组的迭代法_JOR迭代_JOR迭代法_processegz_

    解线性方程组的迭代法汇总:rs里查森迭代法求线性方程组Ax=b的解crs里查森参数迭代法求线性方程组Ax=b的解grs里查森迭代法求线性方程组Ax=b的解jacobi雅可比迭代法求线性方程组Ax=b的解gauseidel高斯-赛德尔迭代法求...

    juzhendiedai_迭代矩阵振型_vibration_机械振动_矩阵迭代_迭代模态法_

    在机械工程领域,特别是在结构动力学分析中,"juzhendiedai_迭代矩阵振型_vibration_机械振动_矩阵迭代_迭代模态法_"这个主题涉及到的是一个关键的技术——迭代模态法,用于计算结构的固有频率和振型。这是一种用于...

    高斯赛德尔迭代算法 C语言

    高斯赛德尔迭代算法 C语言实现 高斯赛德尔迭代算法是一种常用的迭代方法,用于解决线性方程组的问题。该算法具有程序简单、存储量小的优点,特别适用于求解系数矩阵为大型稀疏矩阵的方程组。 高斯赛德尔迭代算法的...

    牛顿迭代法,牛顿迭代法求根,matlab

    牛顿迭代法是一种高效求解方程实根的数值方法,尤其在计算机科学和工程计算中广泛应用。这种方法基于泰勒级数展开的思想,通过构造一个线性逼近来近似原函数,并利用这个线性逼近的零点作为下一次迭代的估计。在...

    迭代学习.zip_drawn6rt_迭代学习_迭代学习 matlab_迭代学习 程序_迭代学习程序

    迭代学习是一种机器学习方法,主要用于优化系统的控制策略。在该方法中,系统通过反复执行任务并不断调整其行为来改善性能。在这个“迭代学习.zip”压缩包中,包含了一个名为“ILC-master”的文件,这可能是一个迭代...

    Jacobi迭代法和Gauss-Seidel迭代法求解线性方程组的根

    本文将重点讨论两种常用的迭代法——雅可比迭代法(Jacobi Iteration)和高斯-赛德尔迭代法(Gauss-Seidel Iteration),以及如何用C语言实现它们。 雅可比迭代法是基于分块对角线主导的线性方程组的一种迭代策略。...

    SOR迭代法迭代矩阵谱半径与迭代参数的关系

    SOR 迭代法迭代矩阵谱半径与迭代参数的关系 SOR 迭代法是一种常用的线性代数iteration方法,用于求解线性方程组 Ax=b。其中,SOR 迭代法的收敛性取决于迭代矩阵的谱半径ρ(B)和松弛因子ω的关系。在这篇文章中,...

    Jacobi-雅可比迭代法、高斯-赛德尔迭代法.zip

    在数值计算领域,雅可比迭代法(Jacobi Iteration)和高斯-赛德尔迭代法(Gauss-Seidel Iteration)是解决大型线性系统的重要算法,它们主要用于求解形如 Ax=b 的线性方程组,其中A是系数矩阵,x是未知数向量,b是...

    MATLAB实现线性方程组迭代法求解 JGS 雅克比迭代 Jacobi 数值计算方法 MATLAB

    在本文中,我们将深入探讨如何使用MATLAB进行线性方程组的迭代法求解,特别是聚焦于雅克比迭代(Jacobi Iteration)和改进的雅克比-Gauss-Seidel(JGS)迭代法。这两种方法是数值计算领域中解决大型稀疏线性系统的...

    迭代法-穿越沙漠问题 迭代法-穿越沙漠问题

    迭代法是一种在计算机科学和数学中广泛使用的求解方法,特别是在优化问题和数值分析中。在给定的“迭代法-穿越沙漠问题”中,我们可以理解这是一个基于迭代算法的编程挑战,可能是为了模拟或解决某种涉及到多步骤...

    Java基础教程之HashMap迭代删除使用方法

    Java基础教程之HashMap迭代删除使用方法 HashMap是Java中一种常用的数据结构,用于存储键值对。在实际开发中,我们经常需要删除HashMap中的某些元素,而迭代删除是其中一种常见的操作方式。本文将对HashMap迭代删除...

Global site tag (gtag.js) - Google Analytics